Android MVP:Presenter中的安全使用上下文 [英] Android MVP: safe use Context in Presenter
问题描述
在我的应用中,我使用ContentProvider
并使用LoaderManager.LoaderCallbacks<Cursor>.
In my app I work with ContentProvider
and use 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的角度来看,我需要:
From point of view MVP I need:
演示者
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中使用上下文.
So, I need a context in Presenter.
有一些细微差别:
-
演示者了解上下文-这很糟糕,演示者不应该 了解Android.
Presenter know about the Context - it is bad, Presenter should not know about the Android.
在Presenter中具有上下文会导致内存泄漏.
Having a Context in Presenter can lead to memory leak.
我现在担心如何避免出现诸如内存泄漏之类的问题,以及如何最好地在Presenter中传递Context,使用Application Context或Activity/Fragment?
I am now worried about how to avoid problems such as memory leaks, and how best pass Context in Presenter, use Application Context or Activity/Fragment?
推荐答案
向Presenter添加上下文不是很好,因为Presenter负责业务逻辑.要处理上下文,您需要具有片段/活动" 在接口的帮助下利用回调,该接口将说明在处理视图时活动/片段需要执行哪些操作. 片段/活动负责提供上下文.
Adding context to Presenter is not good since, the presenter is responsible for business logic. To deal with context, you need to have the Fragment/Activities make use of Callbacks with the help of interfaces which will state what actions need to be perform by the activity/fragment when dealing with views. Fragment / Activities are responsible to provide Context.
示例:
interface BaseContract {
interface BaseView {
//Methods for View
void onDoSomething();
}
interface BasePresenter {
void doSomething();
}
}
class BaseMainPresenter implements BaseContract.BasePresenter {
BaseContract.BaseView view;
BaseMainPresenter(BaseContract.BaseView view) {
this.view = view;
}
@Override
public void doSomething() {
if (view != null)
view.onDoSomething();
}
}
class DemoClass implements BaseContract.BaseView {
//Create object of Presenter
/****
* Example :
* BaseMainPresenter baseMainPresenter = new BaseMainPresenter(this);
*/
@Override
public void onDoSomething() {
//Deal with Context here.
}
}
这篇关于Android MVP:Presenter中的安全使用上下文的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!