Android MVP:在Presenter中访问内容提供商

时间:2016-07-26 06:41:50

标签: android mvp

我正在开发一个使用Android MVP的项目,到目前为止,我能够理解为这种架构的拇指规则:

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

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

  3. 我正在关注此事,到目前为止,我成功实现了这一点。 在我的项目中,我需要访问ContentProvider和SharedPreference。对于他们来说,我需要将上下文传递给演示者,这是不好的做法。

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

    1. 这是一种标准的方法吗?
    2. 我应该如何实施内容提供商部分?
    3. 我是否遗漏了这种架构实现的内容?

1 个答案:

答案 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。