Android MVP:在Presenter中访问内容提供商
我正在从事一个Android MVP项目,到目前为止,我能理解的这个架构的经验法则是:Android MVP:在Presenter中访问内容提供商,android,mvp,Android,Mvp,我正在从事一个Android MVP项目,到目前为止,我能理解的这个架构的经验法则是: 演示者不应包含任何android代码 视图不应包含对模型的引用 我正在遵循这一点,到目前为止,我成功地实施了这一点。 在我的项目中,我需要访问ContentProvider和SharedReference。对于他们来说,我需要将上下文传递给演示者,这是一种糟糕的做法 一种解决方案是创建一个类来访问SharedReference,并让它实现一个接口,该接口的引用可以传递给演示者 这是一种标准的方法吗 我应该如何
这个体系结构实现是否有遗漏?这是为遇到这个问题的人准备的 在我引用的问题中,“我创建了一个用于访问SharedReference的类,并让它实现接口,该接口的引用可以传递给演示者。” 我从Antonio Leive那里询问了这个解决方案,他写了一篇关于Android MVP的伟大文章,下面是链接 以下是他的答复: “你提到的事情与依赖倒置有关。你必须将框架的使用委托给代码中尽可能少的部分 因此,例如,如果您想在演示者上使用SharedReferences,您将使用名为PreferencesManager的实体(或更具描述性的实体),该实体可能只是一个接口接口的一个实现,它将使用上下文来检索首选项。你可以手动执行注入,如果有许多实体使用上下文,或者使用依赖项注入,这将变得有点乏味。你知道Dagger吗?我在博客中有三篇关于它的文章。虽然它们基于Dagger 1,但理论有助于你理解这个概念。” 我就是这样实施的
interface AppPrefsManager {
<T> void putData(String key,T obj);
<T> T getData(String key, T obj);
}
现在,我的演示者可以访问SharedReferences。1)没有“标准”方式,但IHMO这是最合理的解决方案2)检查,他们确实有一个关于MVP+内容提供商的示例。这就是我在看的。感谢@RiccardoCiovati+1给出了很好的答案。我唯一的问题是“这是最好的方法还是可以改进的?”另外,你有没有找到问题2的解决方案?使用依赖注入,这似乎是一个标准的解决方案。
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;
}
}
AppPrefsManager appprefs=AppPrefs.getInstance(this);
Presentor mypresenter=new Presenter(apprefs);