我是Android MVP模式的新手并且在我的项目上工作我在演示者中有一些与Android Context相关的基本问题.虽然有很多与此相关的答案,但我没有得到一个可以解决我的问题的完美答案.
我有以下问题:
>如何在演示者中访问共享首选项.
>如何访问演示者中的其他系统服务.
>如果我正在使用sqlite数据库,那么在我的数据库中的任何事务期间,通过从演示者到我的sqlite Helper类的调用来完成访问数据库的上下文.
如果我将在演示者中传递我的活动上下文,那么在单元测试期间会出现问题,根据MVP格式也是违规.
我需要一个完美的解决方案,以便我的代码质量不会降低.
注意:我不想使用匕首工具,所以答案应该是匕首独立
解决方法:
在MVP中,您不要在Presenter(P)层中使用Context或Android SDK / Framework中的任何其他内容!这个图层不是Android相关的东西.
1)如何在演示者中访问共享首选项.
你没有.如果需要Presenter中SharedPrefences的值,则可以通过方法调用将值传递给Presenter.
例:
class MainActivity{
String birthday = SharedPrefence.getString(..);
presenter.setSavedBirtday(birthday);
}
2)如何访问演示者内部的其他系统服务.
如前所述;您不在Presenter中访问系统服务.
您可以做的是从Presenter调用系统服务.
振动器示例:
1 – 创建一个界面:
interface OnSystemServiceCaller{
onVibratorCall();
}
2 – 在Activity中实现它
class MainActivity implements OnSystemServiceCaller{
@Override
onVibratorCall(){
Vibrator v = (Vibrator) getSystemService(VIBRATOR);
v.vibrate(50);
}
}
3 – 来自演示者的电话
class Presenter{
OnSystemServiceCaller listener;
public void ifButtonClicked(){
listener.onVibrateCall();
}
}
3)如果我正在使用sqlite数据库,那么在我的数据库中的任何事务期间,通过从演示者到我的sqlite Helper类的调用来完成访问数据库的上下文.
有些人不会喜欢这个答案,这只是一个建议.
您可以通过在app类中使用全局ApplicationContext()来访问您的sqlite(扩展Application的类; see how here,因为您的sqllite是整个应用程序的全局,而不仅仅是特定的Activity,当您需要将数据从sqlite传递到Activity时然后你将它首先传递给Presenter,从Presenter传递给你的Activity,就像我们向Vibrator方法发送一个调用一样