Android MVP-共享首选项

时间:2018-09-17 12:09:33

标签: java android sharedpreferences mvp

我开始学习MVP,但是我有一些与SharedPreferences有关的问题,据我所知,如果我想在sharedPreferences中保存一个值,我需要将此值传递给演示者,演示者调用模型进行保存该值,如果我想从sharedPreference中获取或删除一个值,我将应用相同的逻辑,但是如果我不通过Context,那么做到这一点的最佳方法是什么?

我说了一些代码,人们习惯于将构造函数方法中的Context直接传递给Model,但是我仍然认为这不是一个好主意。

你们有什么想法吗?

谢谢, 泰雷兹

2 个答案:

答案 0 :(得分:2)

如果要使其可以进行单元测试,则在Presenter中不应存在Android特定的导入。

您可以做的是,在SharedPreferences上方创建一个抽象层,我们将其称为Cache,它将是所有必需的缓存方法的接口,然后您可以使用提供一个具体的实现SharedPreferences

以下是该想法的简要说明:

interface Cache {
// Your caching methods
}

class CacheImpl implements Cache {

    private SharedPreferences sharedPrefs;

    public CacheImpl(Context context) {
        // Takes a context to init sharedPrefs.
    }

    // implements all of Cache's methods
}

然后,您将该实现的引用传递给Presenter的构造函数(最好使用DI将其注入到Presenter构造函数中):

Cache cache = new CacheImpl(myContext); // Naturally that would be an activity context
MyPresenter presenter = new MyPresenter(cache);

然后在演示者中,您将在构造函数中收到该实例:

private Cache cache;

public MyPresenter(Cache cache) {
    this.cache = cache;
}

然后您可以使用cache变量,而无需知道其具体实现,也不必为其提供上下文。

答案 1 :(得分:1)

在View内部创建一个存储类对象,并在存储类构造函数中传递上下文。

然后从View类中的presenter(构造函数)中传递此存储类对象。

然后,每当需要保存演示者的数据或从演示者那里获取一些数据时,只需从传递的对象中调用存储类的方法即可。

这样,您将不需要将上下文发送给演示者。

查看课程

public class ViewClass extends ActionBarActivity {

    private MyPresenter presenter;
    private MyStorage storage;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        storage = new MyStorage(this);
        presenter = new MyPresenter(this,storage);
    }

}

MyStorage类

public class MyStorage {

    private Context mContext;

    public MyStorage(Context context) {
        this.mContext = context;
    }

    public void saveData(String data){

    }

    public String getData(){
        return "";
    }
}

MyPresenter类

public class MyPresenter {
    private final ViewClass mView;
    private final MyStorage mStorage;

    public MyPresenter(ViewClass viewClass, MyStorage storage) {
        this.mView = viewClass;
        this.mStorage = storage;
    }
}