文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Jetpack Startup库怎么使用

2023-07-05 01:59

关注

这篇文章主要介绍了Jetpack Startup库怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Jetpack Startup库怎么使用文章都会有所收获,下面我们一起来看看吧。

简单认识一下Startup

nowinandroid项目作为目前google官方来演示MAD(现代Android开发技术)的示例项目,里面大量依赖运用了jetpack包下的各种库。

我们今天不讲原理,你只需知道这个库比之前用多个content provider去实现初始化更高效,更精确,更显性,也就是说能合并content provider提升app的启动速度,能准确的控制初始化顺序,能清晰的从代码知道依赖关系。仅仅这些可能jym会说,我们项目不在乎那点启动速度的提升,也没有很多三方库需要走初始化等,根本用不到这个库。

是的,我之前也是这么理解的,但是通过nowinandroid项目发现,有些jetpack内的其他库的初始化现在也交给Startup来完成了,这一点就很重要了。意味着我们可以少写很多样板代码,少写也意味着少犯错。

Startup

编写初始化的代码步骤很简单主要就分3步:

OK了!就这简单3步,下面我们结合项目例子来看

项目代码

object Sync {    // This method is a workaround to manually initialize the sync process instead of relying on    // automatic initialization with Androidx Startup. It is called from the app module's    // Application.onCreate() and should be only done once.    fun initialize(context: Context) {        AppInitializer.getInstance(context)            .initializeComponent(SyncInitializer::class.java)    }}internal const val SyncWorkName = "SyncWorkName"class SyncInitializer : Initializer<Sync> {    override fun create(context: Context): Sync {        WorkManager.getInstance(context).apply {            // Run sync on app startup and ensure only one sync worker runs at any time            enqueueUniqueWork(                SyncWorkName,                ExistingWorkPolicy.KEEP,                SyncWorker.startUpSyncWork(),            )        }        return Sync    }    override fun dependencies(): List<Class<out Initializer<*>>> =        listOf(WorkManagerInitializer::class.java)}

定一个SyncInitializer类实现了泛型为SyncInitializer接口。需要重写接口定义的两个方法:

所以在create方法里面的执行WorkManager.getInstance(context)方法是安全的。我们这篇只关注Startup所以我们只用知道在这个地方WorkManager做了些事情就行,后面会另开一篇单独讲WorkManager。为啥是安全的呢?因为在dependencies方法里面先执行了WorkManagerInitializer::class.java初始化。我们再来看看这个类。

public final class WorkManagerInitializer implements Initializer<WorkManager> {    private static final String TAG = Logger.tagWithPrefix("WrkMgrInitializer");    @NonNull    @Override    public WorkManager create(@NonNull Context context) {        // Initialize WorkManager with the default configuration.        Logger.get().debug(TAG, "Initializing WorkManager with default configuration.");        //这个地方已经完成了单例的构建,后面再调用WorkManager.getInstance(context)获取实例,否则报错        WorkManager.initialize(context, new Configuration.Builder().build());        return WorkManager.getInstance(context);    }    @NonNull    @Override    public List<Class<? extends androidx.startup.Initializer<?>>> dependencies() {        //这里WorkManager的初始化不需要其他初始化构造器,所以返回的是个空集合        return Collections.emptyList();    }}

以上我们就把第一步走完了,现在再来看第二步

<manifest xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools">    <application>        <provider            android:name="androidx.startup.InitializationProvider"            android:authorities="${applicationId}.androidx-startup"            android:exported="false"            tools:node="merge">            <!--  TODO: b/2173216 Disable auto sync startup till it works well with instrumented tests   -->            <meta-data                android:name="com.google.samples.apps.nowinandroid.sync.initializers.SyncInitializer"                android:value="androidx.startup"                tools:node="remove" />        </provider>    </application></manifest>

这里需要注意的是tools:node="remove",在provider层级用的话是全局取消自动初始化,在meta-data层级用的话是单个组件取消自动初始化。例子展示的是单个组件取消自动初始化。另外注意的一点是被依赖的初始化组件是不需要再另外在manifest里面声明的,这就是为什么WorkManagerInitializer没有声明。

@HiltAndroidApp class NiaApplication : Application(), ImageLoaderFactory {    override fun onCreate() {        super.onCreate()        // Initialize Sync; the system responsible for keeping data in the app up to date.        Sync.initialize(context = this)    }        override fun newImageLoader(): ImageLoader {        return ImageLoader.Builder(this)            .components {                add(SvgDecoder.Factory())            }            .build()    }}

上面的代码是app的Application,我们今天的重点是Startup,所以我们先不管其他的。只用看onCreate下的Sync.initialize(context = this)方法。

object Sync {    // This method is a workaround to manually initialize the sync process instead of relying on    // automatic initialization with Androidx Startup. It is called from the app module's    // Application.onCreate() and should be only done once.    fun initialize(context: Context) {        AppInitializer.getInstance(context)            .initializeComponent(SyncInitializer::class.java)    }}

AppInitializer.getInstance(context).initializeComponent(SyncInitializer::class.java)传入SyncInitializer类,实现手动初始化完成。

关于“Jetpack Startup库怎么使用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Jetpack Startup库怎么使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯