MVP presenter中的上下文相关问题

4
我是新手Android MVP模式,正在我的项目中工作,我有一些关于在Presenter中使用Android Context的基本问题。虽然有很多与此相关的答案,但我没有得到一个完美的答案,可以解决我的问题。
我有以下查询:
1.如何在Presenter内部访问共享首选项? 2.如何在Presenter内部访问其他系统服务? 3.如果我在SQLite数据库上工作,那么在由Presenter调用我的SQLite Helper类执行的任何事务期间都需要上下文才能访问数据库。
如果我将我的Activity上下文传递给Presenter,则在单元测试期间会有问题,这也违反了MVP格式。我需要一个完美的解决方案,以便我的代码质量不会降低。
注意:我不想使用Dagger工具,因此答案应该与Dagger无关。
1个回答

4
在MVP中,您不会在Presenter(P)层使用Android SDK/Framework中的Context或其他任何内容!此层用于与Android无关的所有内容。
1)如何在Presenter中访问共享偏好设置。
您不需要这样做。如果您需要从Presenter中获取SharedPrefences的值,则可以通过方法调用将该值传递给Presenter。
示例:
class MainActivity{
 String birthday = SharedPrefence.getString(..);
 presenter.setSavedBirtday(birthday);

 }

2) 如何在Presenter内部访问其他系统服务。

正如之前提到的; 您不应该在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数据库,在从Presenter调用我的SQLite Helper类进行任何事务时,需要上下文来访问数据库。

有些人可能不喜欢这个答案,而其他人则会喜欢,这只是一个建议。

您可以在应用程序类(扩展应用程序的类)中使用全局ApplicationContext()访问您的SQLite请参见此处),因为您的SQLlite是整个应用程序的全局变量,而不仅仅是特定Activity的变量。当您需要将数据从SQLite传递到Activity时,您首先将其传递给Presenter,然后再从Presenter传递给您的Activity,就像我们发送调用到我们的振动器方法一样。


从更新数据库的角度来看,可以像这样进行:Edittext.gettext() -> 将文本传递给Presenter -> 从Presenter -> 到您的Databse层。我还建议查看一下RealmDatabases,它将帮助您解决很多问题,并使所有内容变得更加容易! - user5366495
我知道如何处理 Realm 数据库。我已经在 Realm 上完成了一些项目,因为 Realm 不需要上下文,所以使用 MVP 实现相当容易。但我的一个项目完全基于 SQLite,所以我需要解决方案。 - saksham
将ApplicationContext()存储在静态字段中是安全的吗? - saksham
@saksham 是的,在这种情况下,使用SQLlite是因为它在您的应用程序中被全球使用。 - user5366495

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接