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

Android MVP:在Presenter中访问内容提供商,android,mvp,Android,Mvp,我正在从事一个Android MVP项目,到目前为止,我能理解的这个架构的经验法则是: 演示者不应包含任何android代码 视图不应包含对模型的引用 我正在遵循这一点,到目前为止,我成功地实施了这一点。 在我的项目中,我需要访问ContentProvider和SharedReference。对于他们来说,我需要将上下文传递给演示者,这是一种糟糕的做法 一种解决方案是创建一个类来访问SharedReference,并让它实现一个接口,该接口的引用可以传递给演示者 这是一种标准的方法吗 我应该如何

我正在从事一个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);