【问题标题】:Context Related Problems inside MVP presenterMVP 演示者中的上下文相关问题
【发布时间】:2017-06-24 11:52:52
【问题描述】:

我是 android MVP 模式的新手,在我的项目上工作时,我在演示者中遇到了一些与 Android Context 相关的基本问题。虽然有很多与此相关的答案,但我没有得到一个可以解决我的问题的完美答案。

我有以下疑问:

  1. 如何访问 Presenter 中的共享首选项。
  2. 如何访问 Presenter 中的其他系统服务。
  3. 如果我正在处理 SQLite 数据库,那么在我的数据库中通过从演示者调用我的 SQLite Helper 类完成的任何事务期间,需要上下文来访问数据库。

如果我将在演示者中传递我的活动上下文,那么它将在单元测试期间出现问题,根据 MVP 格式,这也是违规行为。 我需要一个完美的解决方案,这样我的代码质量才不会下降。

注意:我不想使用匕首工具,所以答案应该与匕首无关

【问题讨论】:

    标签: android sqlite mvp


    【解决方案1】:

    在 MVP 中,您不要在 Presenter (P) 层中使用 Context 或 Android SDK/Framework 中的任何其他内容!该层用于除 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 数据库,那么在我的数据库中通过从演示者调用我的 SQLite Helper 类完成的任何事务期间,需要上下文来访问数据库。

    有些人不喜欢这样回答其他人的意愿,这只是一个建议。

    您可以通过在您的应用程序类(扩展应用程序的类;see how here)中使用全局 SQLite 来访问您的 SQLite,因为您的 SQLlite 对于整个应用程序是全局的,而不仅仅是特定的 Activity 当您需要将数据从 SQLite 传递到 Activity,然后您首先将其传递给 Presenter,然后从 Presenter 传递到您的 Activity,就像我们发送对 Vibrator 方法的调用一样

    【讨论】:

    • @saksham 全局上下文见这里:stackoverflow.com/a/9445685/5366495。假设您从Edittext 获得的值可以这样更新数据库,例如:Edittext.gettext() -> pass text to Presenter -> from Presenter -> To your Databse layer。我还建议您查看RealmDatabases,这将帮助您解决大部分问题并使一切变得更加简单!
    • 我知道如何处理领域数据库。我在领域做过项目,因为领域不需要上下文,所以用 MVP 实现很容易,但我的一个项目完全基于 sql lite,所以我需要解决方案
    • 在静态字段中存储 ApplicationContext() 是否安全?
    • @saksham 是的,在这种情况下使用 SQLlite 是因为它在您的应用程序中全局使用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2019-09-27
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多