Android MVP:在Presenter中安全使用Context

Ale*_*ndr 15 mvp android design-patterns android-cursor

在我的应用程序中,我使用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;
    }

}
Run Code Online (Sandbox Code Playgroud)

从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)
    }

}
Run Code Online (Sandbox Code Playgroud)

所以,我需要Presenter中的上下文.

有一些细微差别:

  1. 主持人知道上下文 - 这很糟糕,Presenter不应该知道Android.

  2. 在Presenter中使用Context可能会导致内存泄漏.

我现在担心如何避免内存泄漏等问题,以及如何在Presenter中最好地传递Context,使用Application Context或Activity/Fragment?

小智 3

向 Presenter 添加上下文并不好,因为 Presenter 负责业务逻辑。为了处理上下文,您需要让片段/活动在接口的帮助下使用回调,该接口将说明在处理视图时活动/片段需要执行哪些操作。Fragment/Activity负责提供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.
        }
    }
Run Code Online (Sandbox Code Playgroud)