Android MVP:安全使用Presenter中的上下文
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.
有一些細微差別:
主持人知道上下文 – 這是壞的,演講者不應該
瞭解Android.
在Presenter中擁有上下文可能導致記憶體洩漏.
我現在擔心如何避免記憶體洩漏等問題,以及如何最好地傳遞Presenter中的Context,使用Application Context或Activity / Fragment?
向Presenter新增上下文不是很好,因為演示者負責業務邏輯.要處理上下文,您需要具有片段/活動
在介面的幫助下使用回撥函式,這些介面將說明處理檢視時活動/片段需要執行的操作.
片段/活動負責提供上下文.
例:
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. } }
http://stackoverflow.com/questions/31951537/android-mvp-safe-use-context-in-presenter