最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

官網(wǎng)項(xiàng)目Jetpack?Startup庫(kù)學(xué)習(xí)

 更新時(shí)間:2023年02月01日 16:19:51   作者:kandra777  
這篇文章主要為大家介紹了官網(wǎng)項(xiàng)目Jetpack?Startup庫(kù)學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

簡(jiǎn)單認(rèn)識(shí)一下Startup

nowinandroid項(xiàng)目作為目前google官方來演示MAD(現(xiàn)代Android開發(fā)技術(shù))的示例項(xiàng)目,里面大量依賴運(yùn)用了jetpack包下的各種庫(kù)。通過分析學(xué)習(xí)這些庫(kù)在項(xiàng)中的實(shí)際使用可以幫助我們比直接閱讀庫(kù)的文檔來更好的理解和學(xué)習(xí)。希望通過學(xué)習(xí)后可以幫助到我們能熟練地在我們自己的項(xiàng)目中正確高效的使用到j(luò)etpack里面的各種強(qiáng)大庫(kù)。不廢話了,下面進(jìn)入我們今天的正題——Startup

App Startup  |  Android Developers 官網(wǎng)的指南有興趣可以看看

我們今天不講原理,你只需知道這個(gè)庫(kù)比之前用多個(gè)content provider去實(shí)現(xiàn)初始化更高效,更精確,更顯性,也就是說能合并content provider提升app的啟動(dòng)速度,能準(zhǔn)確的控制初始化順序,能清晰的從代碼知道依賴關(guān)系。僅僅這些可能jym會(huì)說,我們項(xiàng)目不在乎那點(diǎn)啟動(dòng)速度的提升,也沒有很多三方庫(kù)需要走初始化等,根本用不到這個(gè)庫(kù)。

是的,我之前也是這么理解的,但是通過nowinandroid項(xiàng)目發(fā)現(xiàn),有些jetpack內(nèi)的其他庫(kù)的初始化現(xiàn)在也交給Startup來完成了,這一點(diǎn)就很重要了。意味著我們可以少寫很多樣板代碼,少寫也意味著少犯錯(cuò)。所以我覺的還是有必要單獨(dú)寫一篇文章來說說Startup

編寫初始化的代碼步驟很簡(jiǎn)單主要就分3步:

  • 定義實(shí)現(xiàn)Initializer接口的實(shí)現(xiàn)類
  • 配置manifest
  • 自動(dòng)或手動(dòng)調(diào)用初始化操作

OK了!就這簡(jiǎn)單3步,下面我們結(jié)合項(xiàng)目例子來看

項(xiàng)目代碼

  • 先看第一步
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"
/**
 * Registers work to sync the data layer periodically on app startup.
 */
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)
}

定一個(gè)SyncInitializer類實(shí)現(xiàn)了泛型為SyncInitializer接口。需要重寫接口定義的兩個(gè)方法:

  •  create() 方法, 它包含初始化組件所需的所有操作,并返回一個(gè)Sync的實(shí)例.
  •  dependencies() 方法, 返回當(dāng)前初始化器需要依賴的其他初始化器集合,我們可以用這個(gè)方法來變相的實(shí)現(xiàn)各個(gè)初始化器的執(zhí)行順序。

所以在create方法里面的執(zhí)行WorkManager.getInstance(context)方法是安全的。我們這篇只關(guān)注Startup所以我們只用知道在這個(gè)地方WorkManager做了些事情就行,后面會(huì)另開一篇單獨(dú)講WorkManager。為啥是安全的呢?因?yàn)樵?code>dependencies方法里面先執(zhí)行了WorkManagerInitializer::class.java初始化。我們?cè)賮砜纯催@個(gè)類。

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.");
        //這個(gè)地方已經(jīng)完成了單例的構(gòu)建,后面再調(diào)用WorkManager.getInstance(context)獲取實(shí)例,否則報(bào)錯(cuò)
        WorkManager.initialize(context, new Configuration.Builder().build());
        return WorkManager.getInstance(context);
    }
    @NonNull
    @Override
    public List<Class<? extends androidx.startup.Initializer<?>>> dependencies() {
        //這里WorkManager的初始化不需要其他初始化構(gòu)造器,所以返回的是個(gè)空集合
        return Collections.emptyList();
    }
}

以上我們就把第一步走完了,現(xiàn)在再來看第二步

  • 再看第二步
<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層級(jí)用的話是全局取消自動(dòng)初始化,在meta-data層級(jí)用的話是單個(gè)組件取消自動(dòng)初始化。例子展示的是單個(gè)組件取消自動(dòng)初始化。另外注意的一點(diǎn)是被依賴的初始化組件是不需要再另外在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)
    }
    /**
     * Since we're displaying SVGs in the app, Coil needs an ImageLoader which supports this
     * format. During Coil's initialization it will call `applicationContext.newImageLoader()` to
     * obtain an ImageLoader.
     *
     * @see <a  rel="external nofollow" >Coil</a>
     */
    override fun newImageLoader(): ImageLoader {
        return ImageLoader.Builder(this)
            .components {
                add(SvgDecoder.Factory())
            }
            .build()
    }
}

上面的代碼是app的Application,我們今天的重點(diǎn)是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類,實(shí)現(xiàn)手動(dòng)初始化完成。

以上就是nowinandroid項(xiàng)目對(duì)Startup庫(kù)的使用,并且上面我們也知道了我們自定義的初始化器在初始化的時(shí)候通過WorkManager做了些事情。那么下篇我們還是通過這個(gè)例子來看看nowinandroid是怎么使用WorkManager這個(gè)庫(kù)的,更多關(guān)于官網(wǎng)Jetpack Startup庫(kù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Flutter自定義搜索框效果

    Flutter自定義搜索框效果

    這篇文章主要為大家詳細(xì)介紹了Flutter自定義搜索框效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Android自動(dòng)獲取短信驗(yàn)證碼功能

    Android自動(dòng)獲取短信驗(yàn)證碼功能

    這篇文章主要介紹了Android自動(dòng)獲取短信驗(yàn)證碼功能,通過自定義短信監(jiān)聽器用于自動(dòng)填充驗(yàn)證碼功能,具體實(shí)現(xiàn)代碼大家可以參考下本文
    2017-04-04
  • 在Android源碼中編譯出指定jar包的操作

    在Android源碼中編譯出指定jar包的操作

    這篇文章主要介紹了在Android源碼中編譯出指定jar包的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • Android編程畫圖之抗鋸齒解決方法

    Android編程畫圖之抗鋸齒解決方法

    這篇文章主要介紹了Android編程畫圖之抗鋸齒解決方法,分析了兩種抗鋸齒的實(shí)現(xiàn)方法,并給出了實(shí)例代碼進(jìn)行總結(jié),需要的朋友可以參考下
    2016-01-01
  • Flutter 首頁(yè)必用組件NestedScrollView的示例詳解

    Flutter 首頁(yè)必用組件NestedScrollView的示例詳解

    今天介紹的組件是NestedScrollView,大部分的App首頁(yè)都會(huì)用到這個(gè)組件。對(duì)Flutter 首頁(yè)必用組件NestedScrollView的相關(guān)知識(shí)感興趣的一起看看吧
    2020-05-05
  • Android ContentProvider基礎(chǔ)應(yīng)用詳解

    Android ContentProvider基礎(chǔ)應(yīng)用詳解

    ContentProvider是android四大組件之一。它是不同應(yīng)用程序之間交換數(shù)據(jù)的標(biāo)準(zhǔn)api,ContentProvider以某種uri的形式對(duì)外提供數(shù)據(jù),允許其它應(yīng)用程序?qū)ζ湓L問或者修改數(shù)據(jù)。本文將介紹ContentProvider的基礎(chǔ)應(yīng)用,感興趣的可以學(xué)習(xí)一下
    2021-12-12
  • Android Service生命周期詳解

    Android Service生命周期詳解

    這篇文章主要介紹了Android Service生命周期詳解,本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Android中封裝SDK時(shí)常用的注解總結(jié)

    Android中封裝SDK時(shí)常用的注解總結(jié)

    這篇文章主要給大家總結(jié)了在Android中封裝SDK時(shí)常用的注解的相關(guān)資料,文中介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-05-05
  • Android實(shí)現(xiàn)簡(jiǎn)單的撥號(hào)器功能

    Android實(shí)現(xiàn)簡(jiǎn)單的撥號(hào)器功能

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)單的撥號(hào)器功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 用Flutter做桌上彈球(繪圖(Canvas&CustomPaint)API)

    用Flutter做桌上彈球(繪圖(Canvas&CustomPaint)API)

    這篇文章主要介紹了用Flutter做桌上彈球 聊聊繪圖(Canvas&CustomPaint)API,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07

最新評(píng)論

察雅县| 祥云县| 巴中市| 通海县| 盐山县| 启东市| 石景山区| 瓦房店市| 宁晋县| 磐安县| 慈溪市| 库车县| 阜康市| 临夏县| 安阳县| 长丰县| 景宁| 葵青区| 张北县| 峨边| 华安县| 建水县| 湖南省| 来安县| 朔州市| 邮箱| 永胜县| 搜索| 福清市| 外汇| 西充县| 三江| 乌拉特中旗| 华容县| 安图县| 墨脱县| 朝阳区| 黎城县| 梨树县| 兴业县| 托克托县|