我开始学习MVP,但是我有一些与SharedPreferences有关的问题,据我所知,如果我想在sharedPreferences中保存一个值,我需要将此值传递给演示者,演示者调用模型进行保存该值,如果我想从sharedPreference中获取或删除一个值,我将应用相同的逻辑,但是如果我不通过Context,那么做到这一点的最佳方法是什么?
我说了一些代码,人们习惯于将构造函数方法中的Context直接传递给Model,但是我仍然认为这不是一个好主意。
你们有什么想法吗?
谢谢, 泰雷兹
答案 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;
}
}