【发布时间】:2015-08-11 20:40:26
【问题描述】:
在我的应用程序中,我使用 ContentProvider 并使用 LoaderManager.LoaderCallbacks<Cursor>.
片段(视图)
public class ArticleCatalogFragment extends BaseFragment
implements ArticleCatalogPresenter.View,
LoaderManager.LoaderCallbacks<Cursor> {
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return onCreateArticleCatalogLoader(args);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
data.registerContentObserver(new LoaderContentObserver(new Handler(), loader));
updateUI(data);
}
private Loader onCreateArticleCatalogLoader(Bundle args) {
int categoryId = args.getInt(CATEGORY_ID);
Loader loader = new ArticleCatalogLoader(this.getActivity(), categoryId);
return loader;
}
}
从MVP的角度来看我需要:
演示者
public class ArticleCatalogPresenter extends BasePresenter
implements LoaderManager.LoaderCallbacks<Cursor> {
View view;
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
return onCreateArticleCatalogLoader(args);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
data.registerContentObserver(new LoaderContentObserver(new Handler(), loader));
view.updateUI(data);
}
private Loader onCreateArticleCatalogLoader(Bundle args) {
int categoryId = args.getInt(CATEGORY_ID);
Loader loader = new ArticleCatalogLoader(context, categoryId); // need Context
return loader;
}
interface View {
updateUI(Cursor data)
}
}
所以,我需要 Presenter 中的上下文。
有一些细微差别:
演示者知道上下文 - 这很糟糕,演示者不应该 了解安卓。
在 Presenter 中有上下文可能会导致内存泄漏。
我现在很担心如何避免内存泄漏等问题,如何最好地在Presenter中传递Context,使用Application Context还是Activity/Fragment?
【问题讨论】:
-
应用上下文是要走的路。如果视图需要活动上下文,它可以自己存储它(在构造函数中传递),只要您的演示者在活动/片段中幸存下来,请确保您不持有对视图的强引用(不管)。
-
另一个想法是你可以让你的活动/片段扮演演示者的角色。在我看来,您似乎已经让您的片段扮演了视图的角色,这有点奇怪,因为片段的基本功能远远超过了演示者的基本功能。您的视图位于 xml 文件和视图子类中。
-
感谢您的反馈。当Presenter中的部分业务逻辑(最大部分)和Fragment中的另一部分(使用CursorLoader)时,我遇到了这种情况,这会产生问题。我想在 Presenter 中移动所有业务逻辑。
-
嗨@Alexandr,您找到任何好的解决方案了吗?
-
嗨!现在我已经更改了架构,并且在演示者中没有上下文。但如果是这样的问题,我想使用依赖注入和匕首。 Dagger 帮助您将上下文注入到任何地方,并且很容易确保这是应用程序上下文。
标签: android design-patterns mvp android-cursor