在Dagger 2中异步构造依赖图

时间:2015-09-23 11:30:18

标签: android asynchronous dagger-2

这是一个更理论化的问题。如果我的方向错误,请告诉我。

有没有办法在Dagger 2中异步/并行加载一些图依赖项?它应该在Dagger的背景下考虑吗?

我的问题主要与应用启动时间有关。许多外部依赖项如Mixpanel,Crashlytics / Fabric,Retrofit(RestAdapter)导致应用程序的预热时间超过1秒。

对我有很大帮助的是Lazy<>界面,但最后的效果仍然不能满足我。

有什么想法吗?

示例

应用程序具有SplashActivity,它依赖于SplashActivityPresenter,它取决于:Mixpanel,RestAdapter和Crashlytics库(以及一些“较小”的对象)。他们每个都有.init()方法需要花费很多时间(在Nexus 5,Android M上,Mixpanel初始化大约需要200ms。因此,在用户看到Splash屏幕之前大约需要2秒。

有没有办法并行构建这些对象?

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线程上运行,那么你必须修改它们,否则你不应该有任何问题。