gpt4 book ai didi

android - 在 Dagger 2 中异步构建依赖关系图

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:06:33 24 4
gpt4 key购买 nike

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

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

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

对我帮助很大的是Lazy<>界面,但是最后的效果还是不能让我满意。

有什么想法吗?

示例

App 有 SplashActivity,它依赖于 SplashActivityPresenter,而 SplashActivityPresenter 又依赖于:Mixpanel、RestAdapter 和 Crashlytics 库(以及一些“较小”的对象)。他们每个人都有 .init() 方法,这会花费很多时间(Mixpanel 初始化在 Nexus 5 和 Android M 上大约需要 200 毫秒。因此在用户看到启动画面之前大约需要 2 秒。

有什么方法可以并行构造这些对象吗?

最佳答案

保持图形创建同步并延迟对象创建,直到使用 Rx 的延迟订阅。在创建对象时,可以通过主题通知下游注入(inject)。

@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,或依赖作为事件总线的 Subject,这将传递下游注入(inject)对象必须等待的对象的 bool 状态。

关于android - 在 Dagger 2 中异步构建依赖关系图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32738410/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com