这是一个更理论化的问题。如果我的方向错误,请告诉我。
有没有办法在Dagger 2中异步/并行加载一些图依赖项?它应该在Dagger的背景下考虑吗?
我的问题主要与应用启动时间有关。许多外部依赖项如Mixpanel,Crashlytics / Fabric,Retrofit(RestAdapter)导致应用程序的预热时间超过1秒。
对我有很大帮助的是Lazy<>界面,但最后的效果仍然不能满足我。
有什么想法吗?
示例
应用程序具有SplashActivity,它依赖于SplashActivityPresenter,它取决于:Mixpanel,RestAdapter和Crashlytics库(以及一些“较小”的对象)。他们每个都有.init()方法需要花费很多时间(在Nexus 5,Android M上,Mixpanel初始化大约需要200ms。因此,在用户看到Splash屏幕之前大约需要2秒。
有没有办法并行构建这些对象?
答案 0 :(得分:7)
保持图形创建同步并推迟创建对象,直到使用Rx的延迟订阅。在创建对象时,可以通过主题通知下游注射。
@Module public static class AppModule{
@Provides @Singleton
public Observable<A> provideA(){
return Observable.defer(
() -> Observable.just(new A())
);
}
}
public class MainActivity extends AppCompatActivity{
@Inject Observable<A> aObservable;
A a;
AppComponent appComponent;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
if(appComponent == null){
appComponent = ((App) getApplication())
.getAppComponent();
}
appComponent.inject(this);
aObservable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<A>(){
@Override public void call(final A aa){
a = aa;
Log.d("MainActivity", "a = aa");
}
});
}
}
警告:必须手动检查对象!null,或者依赖于作为事件总线的主体,它将传递下游注入对象必须等待的对象的布尔状态。
答案 1 :(得分:1)
Dagger 2的对象图创建没什么特别之处。如果您希望在后台线程中完成,只需在后台线程上调用DaggerYourComponent.create()
或DaggerYourComponent.Builder.build()
(使用您首选的方法执行此操作 - 例如AsyncTask)。
如果你有任何@Inject
构造函数假设它们将在UI线程上运行,那么你必须修改它们,否则你不应该有任何问题。