我正在开发一个使用Android MVP的项目,到目前为止,我能够理解为这种架构的拇指规则:
Presenter不应包含任何Android代码。
视图不应包含对模型的引用。
我正在关注此事,到目前为止,我成功实现了这一点。 在我的项目中,我需要访问ContentProvider和SharedPreference。对于他们来说,我需要将上下文传递给演示者,这是不好的做法。
一种解决方案是创建一个用于访问SharedPreference的类,并让它实现可以将引用传递给演示者的接口。
我是否遗漏了这种架构实现的内容?
答案 0 :(得分:2)
这适用于遇到此问题的人。
在我引用的问题中 - "我创建了一个用于访问SharedPreference的类,并让它实现了可以将引用传递给演示者的接口。"
我询问了Antonio Leive的这个解决方案,他写了一篇关于Android MVP的精彩文章,这里是链接http://antonioleiva.com/mvp-android/。
以下是他的回复:
"你提到的事情与依赖倒置有关。您必须将框架的使用委托给代码的最小可能部分。
因此,例如,如果您想在演示者上使用SharedPreferences,您将使用一个名为PreferencesManager的实体(或更具描述性的实体),它可能只是一个界面。然后,您(通过构造函数或setter)注入接口的实现,该实现将使用上下文来检索首选项。您可以手动执行注入,如果您有许多使用上下文的实体或使用依赖注入器,这将变得有点单调乏味。你知道Dagger吗?我在博客中有三篇关于它的文章。虽然它们基于Dagger 1,但该理论可以帮助您理解这个概念。"
这是我实施的方式,
interface AppPrefsManager {
<T> void putData(String key,T obj);
<T> T getData(String key, T obj);
}
创建上述界面的实现,
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);
现在,我的Presenter可以访问SharedPreferences。