日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

[Android]在Dagger 2中使用RxJava来进行异步注入(翻译)

發(fā)布時(shí)間:2023/11/29 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [Android]在Dagger 2中使用RxJava来进行异步注入(翻译) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


以下內(nèi)容為原創(chuàng),歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明
來自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6236646.html

在Dagger 2中使用RxJava來進(jìn)行異步注入

原文:http://frogermcs.github.io/async-injection-in-dagger-2-with-rxjava

幾星期前我寫了一篇關(guān)于在Dagger 2中使用Producers進(jìn)行異步注入的文章。在后臺(tái)線程中執(zhí)行對(duì)象的初始化又一個(gè)很好的優(yōu)勢(shì) - 它負(fù)責(zé)實(shí)時(shí)(每秒60幀可以保持界面流暢)繪制UI時(shí)不會(huì)在主線程中阻塞。

值得一提的是,緩慢的初始化過程并不是每個(gè)人都會(huì)覺得是個(gè)問題。但是如果你真的關(guān)心這個(gè),所有外部庫在構(gòu)造以及在任何init()方法中進(jìn)行磁盤/網(wǎng)絡(luò)的操作會(huì)很常見。如果你不能確定這一點(diǎn),我建議你嘗試下AndroidDevMetrics - 我的Android性能測(cè)量庫。它會(huì)告訴你在app中需要花多少時(shí)間來顯示特定的界面,還有(如果你使用了Dagger 2)在依賴圖表中提供每個(gè)對(duì)象消耗了多少時(shí)間。

不幸的是Producers并不是為Android設(shè)計(jì)的,它有以下缺陷:

  • 依賴使用了Guava(會(huì)引起64k方法問題,增加build時(shí)間)
  • 并不是非常快的(注入機(jī)制會(huì)阻塞主線程幾毫秒到幾十毫秒的世界,這取決于設(shè)備)
  • 不能使用@Inject注解(代碼會(huì)有一點(diǎn)混亂)

雖然我們不能解決最后兩個(gè)問題,但是第一個(gè)我們可以在Android Project中解決。

使用RxJava進(jìn)行異步注入

幸運(yùn)的是,有大量的Android開發(fā)者使用了RxJava(和RxAndroid)來在我們app中編寫異步代碼。讓我們來嘗試在Dagger 2中使用它來進(jìn)行異步注入。

異步@Singleton注入

這是我們繁重的對(duì)象:

@Provides @Singleton HeavyExternalLibrary provideHeavyExternalLibrary() {HeavyExternalLibrary heavyExternalLibrary = new HeavyExternalLibrary();heavyExternalLibrary.init(); //This method takes about 500msreturn heavyExternalLibrary; }

現(xiàn)在讓我們來創(chuàng)建一個(gè)額外的provide...()方法,它返回一個(gè)Observable<HeavyExternalLibrary>對(duì)象,它會(huì)異步調(diào)用以下代碼:

@Singleton @Provides Observable<HeavyExternalLibrary> provideHeavyExternalLibraryObservable(final Lazy<HeavyExternalLibrary> heavyExternalLibraryLazy) {return Observable.create(new Observable.OnSubscribe<HeavyExternalLibrary>() {@Overridepublic void call(Subscriber<? super HeavyExternalLibrary> subscriber) {subscriber.onNext(heavyExternalLibraryLazy.get());}}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); }

讓我們逐行來分析:

  • @Singleton - 記住這個(gè)很重要,Observable對(duì)象將會(huì)是一個(gè)單例,而不是HeavyExternalLibrary。Singleton也會(huì)阻止創(chuàng)建額外的Observable對(duì)象。
  • @Providers - 因?yàn)檫@個(gè)方法是@Module注解了的類的一部分。你還記得Dagger 2 API嗎?
  • Lazy<HeavyExternalLibrary> heavyExternalLibraryLazy對(duì)象阻止Dagger(否則,在調(diào)用provideHeavyExternalLibraryObservable()方法調(diào)用的瞬間對(duì)象就會(huì)被創(chuàng)建)內(nèi)部對(duì)HeavyExternalLibrary對(duì)象的初始化。
  • Observable.create(...)代碼 - 它將在每次這個(gè)Observable被訂閱時(shí)通過調(diào)用heavyExternalLibraryLazy.get()返回heavyExternalLibrary對(duì)象。
  • .subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); - 默認(rèn)情況下RxJava代碼會(huì)在Observable被創(chuàng)建的線程中執(zhí)行。這就是為什么我們要把執(zhí)行移動(dòng)到后臺(tái)線程(這里的Schedulers.io()),然后在主線程中(AndroidSchedulers.mainThread())觀察結(jié)果。

我們的Observable像圖表中其它對(duì)象一樣被注入,但是heavyExternalLibrary對(duì)象本身將會(huì)延遲一點(diǎn)才可用:

public class SplashActivity {@InjectObservable<HeavyExternalLibrary> heavyExternalLibraryObservable;//This will be injected asynchronouslyHeavyExternalLibrary heavyExternalLibrary; @Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate();//...heavyExternalLibraryObservable.subscribe(new SimpleObserver<HeavyExternalLibrary>() {@Overridepublic void onNext(HeavyExternalLibrary heavyExternalLibrary) {//Our dependency will be available from this momentSplashActivity.this.heavyExternalLibrary = heavyExternalLibrary;}});} }

異步新實(shí)例的注入

上面的代碼展示了怎么去注入單例的對(duì)象。那如果我們想異步注入新的實(shí)例呢?

確認(rèn)我們的對(duì)象不再使用了@Singleton注解:

@Provides HeavyExternalLibrary provideHeavyExternalLibrary() {HeavyExternalLibrary heavyExternalLibrary = new HeavyExternalLibrary();heavyExternalLibrary.init(); //This method takes about 500msreturn heavyExternalLibrary; }

我們Observable<HeavyExternalLibrary> provider方法也會(huì)有一點(diǎn)改變。我們不能使用Lazy<HeavyExternalLibrary>因?yàn)樗粫?huì)在第一次調(diào)用get()方法的時(shí)候(詳見Lazy文檔)才會(huì)創(chuàng)建新的實(shí)例。

這里是更新后的代碼:

@Singleton @Provides Observable<HeavyExternalLibrary> provideHeavyExternalLibraryObservable(final Provider<HeavyExternalLibrary> heavyExternalLibraryProvider) {return Observable.create(new Observable.OnSubscribe<HeavyExternalLibrary>() {@Overridepublic void call(Subscriber<? super HeavyExternalLibrary> subscriber) {subscriber.onNext(heavyExternalLibraryProvider.get());}}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()); }

我們的Observable<HeavyExternalLibrary>可以是一個(gè)單例,,但是每一次我們?nèi)フ{(diào)用它的subscribe()方法的時(shí)候,我們將會(huì)在onNext()方法中得到一個(gè)新的HeavyExternalLibrary實(shí)例:

heavyExternalLibraryObservable.subscribe(new SimpleObserver<HeavyExternalLibrary>() {@Overridepublic void onNext(HeavyExternalLibrary heavyExternalLibrary) {//New instance of HeavyExternalLibrary} });

完全的異步注入

還有另一個(gè)方法是用RxJava在Dagger 2中進(jìn)行異步注入。我們可以使用Observable簡(jiǎn)單封裝整個(gè)注入過程。

我們注入的執(zhí)行是這樣的(代碼摘自GithubClient項(xiàng)目):

public class SplashActivity extends BaseActivity {@InjectSplashActivityPresenter presenter;@InjectAnalyticsManager analyticsManager;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);}//This method is called in super.onCreate() method@Overrideprotected void setupActivityComponent() {final SplashActivityComponent splashActivityComponent = GithubClientApplication.get(SplashActivity.this).getAppComponent().plus(new SplashActivityModule(SplashActivity.this));splashActivityComponent.inject(SplashActivity.this);} }

要讓它變成異步我們只需要使用Observable封裝setupActivityComponent()方法:

@Override protected void setupActivityComponent() {Observable.create(new Observable.OnSubscribe<Object>() {@Overridepublic void call(Subscriber<? super Object> subscriber) {final SplashActivityComponent splashActivityComponent = GithubClientApplication.get(SplashActivity.this).getAppComponent().plus(new SplashActivityModule(SplashActivity.this));splashActivityComponent.inject(SplashActivity.this);subscriber.onCompleted();}}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new SimpleObserver<Object>() {@Overridepublic void onCompleted() {//Here is the moment when injection is done.analyticsManager.logScreenView(getClass().getName());presenter.callAnyMethod();}}); }

正如注釋,所有@Inject注解了的對(duì)象將被未來某一時(shí)刻注入。在返回注入過程是異步的并且不會(huì)對(duì)主線程有很大的影響。

當(dāng)然創(chuàng)建Observable對(duì)象和額外subscribeOn()線程并不是完全免費(fèi)的 - 它將會(huì)花費(fèi)一點(diǎn)時(shí)間。這類似于Producers代碼所產(chǎn)生的影響。

感謝閱讀!

作者

Miroslaw Stanek

Head of Mobile Development @ Azimo


[Android]使用Dagger 2依賴注入 - DI介紹(翻譯):

http://www.cnblogs.com/tiantianbyconan/p/5092083.html


[Android]使用Dagger 2依賴注入 - API(翻譯):

http://www.cnblogs.com/tiantianbyconan/p/5092525.html


[Android]使用Dagger 2依賴注入 - 自定義Scope(翻譯):

http://www.cnblogs.com/tiantianbyconan/p/5095426.html


[Android]使用Dagger 2依賴注入 - 圖表創(chuàng)建的性能(翻譯):

http://www.cnblogs.com/tiantianbyconan/p/5098943.html


[Android]Dagger2Metrics - 測(cè)量DI圖表初始化的性能(翻譯):

http://www.cnblogs.com/tiantianbyconan/p/5193437.html


[Android]使用Dagger 2進(jìn)行依賴注入 - Producers(翻譯):

http://www.cnblogs.com/tiantianbyconan/p/6234811.html


[Android]在Dagger 2中使用RxJava來進(jìn)行異步注入(翻譯):

http://www.cnblogs.com/tiantianbyconan/p/6236646.html


[Android]使用Dagger 2來構(gòu)建UserScope(翻譯):

http://www.cnblogs.com/tiantianbyconan/p/6237731.html


[Android]在Dagger 2中Activities和Subcomponents的多綁定(翻譯):

http://www.cnblogs.com/tiantianbyconan/p/6266442.html

轉(zhuǎn)載于:https://www.cnblogs.com/tiantianbyconan/p/6236646.html

總結(jié)

以上是生活随笔為你收集整理的[Android]在Dagger 2中使用RxJava来进行异步注入(翻译)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。