当前位置: 首页 > article >正文

android——jetpack startup初始化框架

 一、jetpack startup

Android Jetpack Startup是一个库,它简化了Android应用启动过程,尤其是对于那些需要处理复杂数据绑定和初始化逻辑的应用。它的核心在于提供了一个StartupComponent,用于声明应用的初始化逻辑,这个逻辑会在首次启动时异步运行,而不是直接在ApplicationonCreate()方法中。

在传统的Application中初始化,所有的代码通常会放在onCreate()或相关生命周期方法内,如onCreate(), onRestoreInstanceState(), 或者doSomethingOnCreate()这样的自定义方法中。这种做法可能导致UI阻塞,特别是当初始化操作耗时时,用户体验可能会变差。

Jetpack Startup的优势包括:

  1. 非阻塞:通过异步初始化,减轻了onCreate()的压力,避免了主线程的阻塞,保证了更快的启动速度和更流畅的用户界面。
  2. 模块化:将初始化逻辑分离到单独的组件,使得代码更加清晰,便于维护和测试。
  3. 可复用StartupComponent可以被多个场景复用,比如数据加载、配置设置等。

依赖导入:

dependencies {
    implementation "androidx.startup:startup-runtime:1.1.1"
}

示例如下:

AsyncInitializer 类

class AsyncInitializer : Initializer<String> {

    override fun create(context: Context): String {
        Log.e("TAG", "==AsyncInitializer开始初始化==")
        CoroutineScope(Dispatchers.Main).launch {
            // 在IO线程中进行耗时操作
            val result = withContext(Dispatchers.IO) {
                // 这里执行你的异步初始化代码
                val data = loadData()
                Log.e("TAG", "异步获取到的结果为:$data") // 子线程打印异步获取到的结果
            }
        }
        return "AsyncInitializer"
    }

    override fun dependencies(): MutableList<Class<out Initializer<*>>> {
        return Collections.emptyList(); // 没有依赖,可以随机执行

        // 假设AsyncInitializer初始化器依赖于LogInitializer初始化器,需要让LogInitializer先执行
//       return mutableListOf(LogInitializer::class.java)
    }

    private suspend fun loadData(): String {
        // 模拟耗时的加载数据操作,比如从网络获取数据
        delay(3000)
        return "Loaded Data"
    }

}
LogInitializer类
class LogInitializer : Initializer<LogUtil> {

    override fun create(context: Context): LogUtil {
        LogUtil.init(context)
        return LogUtil.getInstance()
    }

    override fun dependencies(): MutableList<Class<out Initializer<*>>> {
        return Collections.emptyList() // 没有依赖,可以随机执行
    }
}
LogUtil类
class LogUtil private constructor() {
    companion object {
        @Volatile
        private var instance: LogUtil? = null

        fun getInstance(): LogUtil {
            if (instance == null) {
                synchronized(LogUtil::class.java) {
                    if (instance == null) {
                        instance = LogUtil()
                    }
                }
            }
            return instance!!
        }

        fun init(context: Context) {
            Log.e("TAG", "==init log==")
        }
    }
}

AndroidManifest.xml  (写在<application  里面 )

<provider
            android:name="androidx.startup.InitializationProvider"
            android:authorities="${applicationId}.androidx-startup"
            android:exported="false"
            tools:node="merge">

            <!-- 顺序是随机的 -->
            <meta-data
                android:name="com.fslihua.initstartup.LogInitializer"
                android:value="androidx.startup" />
            <meta-data
                android:name="com.fslihua.initstartup.AsyncInitializer"
                android:value="androidx.startup" />
<!--禁用单个库就在meta-data中加入 tools:node="remove"
然后在需要的地方去手动的初始化:
AsyncInitializer.getInstance(this)
.initializeComponent(AsyncInitializer::class.java) -->
        </provider>

代码下载地址:https://download.csdn.net/download/wy313622821/89955633

注意:

1、能放在子线程的初始化,就不要放到主线程

2、如果要依赖异步结果的初始化,A依赖B的异步结果,可以把AB放在同一个Initializer里面


http://www.kler.cn/a/382499.html

相关文章:

  • 【Unity基础】粒子系统与VFX Graph的区别
  • 剧本杀小程序,市场发展下的新机遇
  • Meta 上周宣布正式开源小型语言模型 MobileLLM 系列
  • Spring 中的 Environment 对象
  • 【论文速读】Optimization-based Prompt Injection Attack to LLM-as-a-Judge
  • mac|安装redis及RedisDesk可视化软件
  • 区别:矩阵合同和矩阵酉相似
  • Android15音频进阶之Cuttlefish搭建音频开发环境(九十二)
  • 了解数据库并发产生的问题
  • Claude发布桌面客户端!新功能支持分析100页PDF的图像!
  • 知识课堂——高匿ip在不同业务中的重要作用
  • 蓝桥杯真题——乐乐的序列和(C语言)
  • 每日算法一练:剑指offer——字符串篇(2)
  • Lua 怎么解决闭包内存泄漏问题
  • 【Java算法】分治--归并排序
  • C语言之写一个修改数组内容的函数
  • 【ChatGPT】如何使用条件逻辑让ChatGPT生成可选输出
  • 开源思维-到底什么是开源?
  • 【Allure】allure装饰器函数
  • java面试2.0
  • HTML 标签属性——id、class、style 等全局属性详解
  • 【Rust中的迭代器】
  • 综述一部分Knowledge Graphs Meet Multi-Modal Learning:A Comprehensive Survey
  • C 学习(4)
  • 探索信息技术的未来:趋势、机遇与挑战
  • 【MySQL系列】区分大小写与支持表情字符的考量