Android MVP Architecture and Realm - 如何避免在 MVP 层之间传递上下文?

Posted

技术标签:

【中文标题】Android MVP Architecture and Realm - 如何避免在 MVP 层之间传递上下文?【英文标题】:Android MVP Architecture and Realm - How to Avoid Passing Context among the MVP layers? 【发布时间】:2018-12-23 19:59:35 【问题描述】:

我学习 android MVP 已经有一段时间了,在我的大部分应用程序中,我发现在 MVP 层之间传递 上下文数据 用于可测试性目的并不实用。

但是,在某些情况下,需要这样做,例如,为了访问 Realm 数据库,我需要 上下文数据 来执行此实现:

领域实现

 Realm.init(mainContext)

        val config = RealmConfiguration.Builder()
                .name(mainContext.getString(R.string.accountRealm))
                .build()

        realm = Realm.getInstance(config)

只有我可以执行 Realm 的 CRUD 功能。

因此,我必须始终将 上下文数据 从视图层传递到模型层,我认为这不太实用。

我的问题:

    我有没有其他方法可以实现 Realm 功能而无需使用 上下文数据?我应该如何以正确的方式做到这一点?

    在 MVP 层中继续传递 上下文数据 或其他类似的 android 特定代码是否可以/可以接受?就像这个 Realm 案例一样,它是否被视为“可接受的权衡”?

【问题讨论】:

Realm 文件名是String resource 而不仅仅是"wallet.realm" 有什么原因吗? @epicpandaforce 我把它作为字符串资源,所以当需要更改名称时,我只需要编辑 String.xml 文件,而不是手动更改所有具有相同实现的函数。 您可能应该在代码中为此创建一个 Public static final 常量,而您突然删除了对 Context 的依赖。 @epicpandaforce 很抱歉,您所说的“删除了对 Context 的依赖”是什么意思? 【参考方案1】:

代码 sn-p 中有两个缺陷(如果我可以这么说的话)。

首先。 Realm.init(mainContext) 应该在 Application 的 onCreate() 中完成一次。

public class MyApplication extends Application 
  @Override
  public void onCreate() 
    super.onCreate();
    Realm.init(this);
  

然后将MyApplication 添加到您的manifest.xml 文件中,如下所示。

<application
  android:name=".MyApplication"
  <!--rest of properties-->
/>

其次。从资源中读取静态字符串通常是个好主意,但并非在所有情况下都如此。例如,这种情况是一个例外。

创建一个 java 类来保存您的数据库名称,如下所示:

public class AppStatics
    public final static REALM_DATABASE_NAME = "myrealm.realm";

然后只需从该类中获取数据库名称即可为 Realm 数据库设置名称。 .您不必每次都配置 Realm。

public class MyApplication extends Application 
  @Override
  public void onCreate() 
    super.onCreate();
    Realm.init(this);
    RealmConfiguration.Builder()
            .name(mainContext.getString(R.string.accountRealm))
            .build()
    Realm.setDefaultConfiguration(config);
  

现在你可以通过在你的模型中调用Realm realm = Realm.getDefaultInstance();来调用Realm的实例(MVP的数据操作模块)

【讨论】:

以上是关于Android MVP Architecture and Realm - 如何避免在 MVP 层之间传递上下文?的主要内容,如果未能解决你的问题,请参考以下文章

Android MVP Architecture and Realm - 如何避免在 MVP 层之间传递上下文?

Android-architecture之MVCMVPMVVMData-Binding

Android mvp

Android Architecture(中文官方文档)——MVVM、DataBinding、Lifecycle、Room、LiveData

MVP- 浅析如何高效的使用MVP

谷歌官方推出Android应用开发架构组件介绍(Android Architecture Components)