【发布时间】:2017-11-07 22:26:21
【问题描述】:
我有一个应用程序使用 Loader 实现 MVP 模式,以在视图重新创建时维护演示者对象(有一篇关于此 here 的文章)。我是 Dagger 2 的新手,正在尝试将它与当前代码一起实现。
我已经设法让它工作,但现在我的演示者被创建了两次。起初它是使用在 onCreateLoader 中初始化的工厂类创建的,但随后,在添加 Dagger 2 实现时,我创建了两个对象(在工厂类和注入时)。
现在我避免在 onCreateLoader 中创建新的演示者,而是传递注入的演示者。问题在于视图重新创建:每次视图被销毁和重新创建时,都会在 OnCreate / OnCreateView 中注入一个新的演示者。这是场景:
-
一个新的presenter被注入:
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { ... getControllerComponent().inject(this); ... } -
如果
Loader不存在,则会调用初始化Loader、onCreateLoader。请注意,我们传递了被注入的 Presenter:@Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); getLoaderManager().initLoader(PRESENTER_LOADER_ID, null, this); } @Override public Loader<MyPresenter> onCreateLoader(int id, Bundle args) { switch (id) { case PRESENTER_LOADER_ID: return new PresenterLoader<>(getContext(), presenter); //return new PresenterLoader<>(getContext(), new MyPresenterFactory()); } return null; } -
分配从
Loader收到的演示者。如果它刚刚创建,我们会分配已经分配的相同对象,因此不会发生任何事情。但是,如果视图被重新创建,那么 Dagger 2 会注入一个新的 Presenter,在这里我们丢弃新的 Presenter 并用来自Loader的旧 Presenter 替换它。@Override public void onLoadFinished(Loader<MyPresenter> loader, MyPresenter data) { this.presenter = data; }我想维护演示者实例,所以这就是我想要发生的事情;我的问题是在每个视图重新创建一个冗余的演示者对象。首先,这是不必要的,此外,在加载完成之前,视图会持有对不同演示者的引用。很明显这段时间我没有使用presenter(注入之后,加载完成之前),但是我绝对不喜欢,怕以后这个新的presenter被误用。
Dagger 2 专家,有没有办法在第一次创建演示者(在创建 Loader 之前)但在视图娱乐时避免它?非常感谢!
【问题讨论】:
-
你能分享一下匕首组件定义和它所依赖的模块吗?
标签: java android mvp loader dagger-2