gpt4 book ai didi

安卓 MVP : safe use Context in Presenter

转载 作者:可可西里 更新时间:2023-11-01 18:48:06 26 4
gpt4 key购买 nike

在我的应用程序中,我使用 ContentProvider并使用 LoaderManager.LoaderCallbacks<Cursor>.

fragment ( View )

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 中的上下文。

有一些细微差别:

  1. Presenter 知道 Context - 这很糟糕,Presenter 不应该知道了解 Android。

  2. 在 Presenter 中有上下文会导致内存泄漏。

我现在很苦恼如何避免内存泄露等问题,Presenter中如何传递Context最好,使用Application Context还是Activity/Fragment?

最佳答案

向 Presenter 添加上下文并不好,因为 Presenter 负责业务逻辑。要处理上下文,您需要有 fragment/Activity 在接口(interface)的帮助下使用回调,接口(interface)将说明在处理 View 时 Activity/fragment 需要执行哪些操作。 fragment/Activity 负责提供上下文。

例子:

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.
}
}

关于安卓 MVP : safe use Context in Presenter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31951537/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com