博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android小技巧:自动初始化Library
阅读量:6682 次
发布时间:2019-06-25

本文共 2497 字,大约阅读时间需要 8 分钟。

一般来说,一个Library都需要传入一个Context参数以完成初始化,该Context参数可以从Application对象的onCreate方法中获取。因此,大部分库都会提供一个init方法,让你在Application Object中完成调用,本文就介绍另一个方法。首先来看下你现在的代码,可能是这个样子:

public class YourApplication extends Application {    @Override    public void onCreate() {        super.onCreate();        SomeLibrary.init(this);        SomeOtherLibrary.init(this);    }}

这种方法的坏处就是会逼着你一定要写一个Application对象,否则就用不了其他的依赖库,对于处女座来说有时候会觉得很不美好。让我们来换个思路进行这件事,这也是从Firebase的客户端得到的灵感,我们首先创建一个空的ContentProvider,然后再manifest文件中完成注册,不过别把它开放给其他应用。而在应用初始化的时候,它会调用onCreate方法注册全部的ContentProvider,这也就意味着虽然Activity还没有启动,但是可以访问ApplicationContext了,在这里我们也就能初始化那些依赖库了。

public final class YourLibraryInitProvider extends ContentProvider {    public YourLibraryInitProvider() {    }    @Override    public boolean onCreate() {        // get the context (Application context)        Context context = getContext();        // initialize whatever you need    }    @Nullable    @Override    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {        return null;    }    @Nullable    @Override    public String getType(Uri uri) {        return null;    }    @Nullable    @Override    public Uri insert(Uri uri, ContentValues values) {        return null;    }    @Override    public int delete(Uri uri, String selection, String[] selectionArgs) {        return 0;    }    @Override    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {        return 0;    }}

这边有个需要注意的点,就是如果是有固定的字符串,可能在有些设备上就无法运行,因此要保证authorities的属性的唯一性,这也就是传入applicationID的原因:

public final class YourLibraryInitProvider extends ContentProvider {    ...    @Override    public void attachInfo(Context context, ProviderInfo providerInfo) {        if (providerInfo == null) {            throw new NullPointerException("YourLibraryInitProvider ProviderInfo cannot be null.");        }        // So if the authorities equal the library internal ones, the developer forgot to set his applicationId        if ("
.yourlibraryinitprovider".equals(providerInfo.authority)) { throw new IllegalStateException("Incorrect provider authority in manifest. Most likely due to a " + "missing applicationId variable in application\'s build.gradle."); } super.attachInfo(context, providerInfo); } ...}

不过这种方法的坏处就是因为所有的ContentProvider都是运行在主线程中,也就意味着所有的初始化都会在主线程完成。如果你希望要异步的初始化一些库,那么可以选择还是手动地在某个地方进行初始化。

转载地址:http://kvaao.baihongyu.com/

你可能感兴趣的文章
Redis Cluster的noaddr标记
查看>>
isEmpty和isBlank区别
查看>>
Tomcat服务器性能优化
查看>>
Redux 中 combineReducers实现原理
查看>>
好的资料搜说引擎
查看>>
2、ROS实时检测在线IP数并自动对IP做限速
查看>>
[一文一命令]cut命令详解
查看>>
Koala五分钟快速入门
查看>>
Elasticsearch开启groovy动态语言支持
查看>>
sqlserver中查询表,查询表的字段方式
查看>>
过滤器的作用
查看>>
Jenkins配置基于角色的项目权限管理
查看>>
Oryx简介
查看>>
cacti监控安装与配置
查看>>
SUSE10 SP1上安装DB2v9.5数据库
查看>>
Java IO之字符流
查看>>
Confluence 6 修改导航显示选项
查看>>
有hibernate的实体类转化成JSON过滤无干类型
查看>>
Centos+Sersync+inotify实时同步数据文件(一)
查看>>
Windows Live Writer发布多个日志
查看>>