我一直在学习和整合MVP pattern
,并且几乎没有问题。
我从这张图中了解到的是
Activity将创建Presenter
的实例,并将其引用和model
对象传递给演示者
MainPresenter mainPresenter = new MainPresenter(this, new MainModel());
接下来如果演示者需要存储或从本地首选项或远程获取任何数据,它将询问模型。
然后模型将要求存储库存储和检索数据。
我遵循了一些教程,这就是我实现模式的方法。
接口
public interface MainActivityMVP {
public interface Model{
}
public interface View{
boolean isPnTokenRegistered();
}
public interface Presenter{
}
}
活动
MainPresenter mainPresenter = new MainPresenter(this, new MainModel());
mainPresenter.sendDataToServer();
演示
public void sendDataToServer() {
// Here i need to ask `model` to check
do network operation and save data in preference
}
现在问题是我需要上下文来访问sharedPreference
,但我还没有将context
传递到任何地方。我也不想使用static context
。我想知道将上下文传递给MVP模式的正确方法。
答案 0 :(得分:2)
嗯,最好的方法是将您的首选项类包装在一个帮助器类中,并使用Dagger将它注入到您需要的任何位置,这样您的演示者/模型就不需要了解上下文。 例如,我有一个应用程序模块,提供各种单例,其中一个是我的Preferences Util类,它处理共享首选项。
@Provides
@Singleton
public PreferencesUtil providesPreferences(Application application) {
return new PreferencesUtil(application);
}
现在,无论何时我想使用它,我只是@Inject it:
@Inject
PreferencesUtil prefs;
我认为值得学习曲线,因为你的MVP项目会更加分离。
但是,如果您愿意忘记“Presenter不了解Android上下文”规则,您只需在视图界面中添加getContext方法并从视图中获取Context:
public interface MainActivityMVP {
public interface Model{
}
public interface View{
boolean isPnTokenRegistered();
Context getContext();
}
public interface Presenter{
}
}
然后:
public void sendDataToServer() {
Context context = view.getContext();
}
我见过有些人像这样实施MVP,但我个人的偏好是使用Dagger。
您也可以按照评论中的建议使用应用程序文本。
答案 1 :(得分:1)
你所要求的并不是那么远。你有一个模型接口,所以你有一个实现这个接口的类,可能是这样的:
MainModel implements MainActivityMVP.Model{
SharedPreferences mPrefs;
MainModel(Context context){
mPrefs =context.getSharedPreferences("preferences",Context.MODE_PRIVATE);
}
}
因此,您只需要将该引用传递给您的演示者,但不是接收MainModel类,而是可以接收MainActivityMVP.Model。
MainActivityMVP.Presenter mainPresenter = new MainPresenter(this, new MainModel(getContext()));
MainPresenter implements MainActivityMVP.Presenter{
MainActivityMVP.View mView;
MainActivityMVP.Model mModel;
MainPresenter(MainActivityMVP.View view, MainActivityMVP.Model model){
mView = view;
mModel = model;
}
}
通过这种方式,您没有任何上下文引用到您的演示者,并且引用是进入您的MainModel而不是您的MainActivityMVP.Model。
将任何公共方法添加到演示者/视图/模型界面中。你应该有这样的东西:
public interface MainActivityMVP {
public interface Model{
void saveOnSharedPreferences();
}
public interface View{
boolean isPnTokenRegistered();
}
public interface Presenter{
void sendDataToServer();
}
}