gpt4 book ai didi

安卓 MVP :Accessing Content Provider in Presenter

转载 作者:太空狗 更新时间:2023-10-29 13:12:24 26 4
gpt4 key购买 nike

我正在使用 Android MVP 开发一个项目,到目前为止,我能够理解的作为该架构经验法则的是:

  1. Presenter 不应包含任何 android 代码。

  2. View 不应包含对模型的引用。

我正在关注这个,到目前为止我已经成功地实现了这个。在我的项目中,我需要访问 ContentProvider 和 SharedPreference。对于他们,我需要将上下文传递给演示者,这是不好的做法。

一个解决方案是创建一个用于访问 SharedPreference 的类,并让它实现可以将其引用传递给演示者的接口(interface)。

  1. 这是执行此操作的标准方法吗?
  2. 我应该如何实现内容提供者部分?

我是否遗漏了此架构实现的某些内容?

最佳答案

这是为那些遇到这个问题的人准备的。

在我引用的问题中 - “我创建了一个用于访问 SharedPreference 的类,并让它实现可以将其引用传递给演示者的接口(interface)。”

我向 Antonio Leive 询问了这个解决方案,他在 Android MVP 上写了一篇很棒的文章,这里是链接 http://antonioleiva.com/mvp-android/ .

这是他的回复:

“你说的这个东西跟依赖倒置有关,你必须把框架的使用委托(delegate)给尽可能少的代码部分。”

因此,例如,如果您想在演示者上使用 SharedPreferences,您将使用一个名为 PreferencesManager(或更具描述性的名称)的实体,它可能只是一个接口(interface)。然后注入(inject)(通过构造函数或 setter )接口(interface)的实现,它将使用上下文来检索首选项。您可以手动进行注入(inject),如果您有许多使用上下文的实体或使用依赖注入(inject)器,这将变得有点乏味。你知道 Dagger 吗?我在博客中有三篇关于它的文章。虽然它们基于 Dagger 1,但该理论可能会帮助您理解这个概念。”

我是这样实现的

 interface AppPrefsManager {
<T> void putData(String key,T obj);
<T> T getData(String key, T obj);
}

创建上述接口(interface)的实现,

  public class AppPrefs implements Repository.Appprefsrepository {

private Context context;

private static AppPrefs ourInstance;
private SharedPreferences preferences;

public static AppPrefs getInstance(Context context) {
if (ourInstance == null) {
ourInstance = new AppPrefs(context);
}
return ourInstance;
}

private AppPrefs(Context context) {
this.context = context;
}

public SharedPreferences getPreferences() {
if (preferences == null) {
preferences = context.getSharedPreferences("prefs", Context.MODE_MULTI_PROCESS);
}
return preferences;
}

public <T> void putData(String key, T obj) {

SharedPreferences.Editor editor = getPreferences().edit();
if (obj instanceof String) {
editor.putString(key, (String) obj);
} else if (obj instanceof Boolean) {
editor.putBoolean(key, ((Boolean) obj).booleanValue());
} else if (obj instanceof Integer) {
editor.putInt(key, ((Integer) obj).intValue());
} else if (obj instanceof Long) {
editor.putLong(key, ((Long) obj).longValue());
}
editor.commit();
}




public <T> T getData(String key, T obj) {
if (obj instanceof String) {
return (T) getPreferences().getString(key, (String) obj);
} else if (obj instanceof Boolean) {
return (T) (Boolean) getPreferences().getBoolean(key, ((Boolean) obj).booleanValue());
} else if (obj instanceof Integer) {
return (T) (Integer) getPreferences().getInt(key, ((Integer) obj).intValue());
} else if (obj instanceof Long) {
return (T) (Long) getPreferences().getLong(key, ((Long) obj).longValue());
}
return null;
}
}

将接口(interface)的实现传递给presenter,我把presenter初始化为

AppPrefsManager appprefs=AppPrefs.getInstance(this);
Presentor mypresenter=new Presenter(apprefs);

现在我的 Presenter 可以访问 SharedPreferences。

关于安卓 MVP :Accessing Content Provider in Presenter,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38582694/

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