java - Android MVP - 演示者中丢失 View 引用 "NullPointerException... null object reference"

标签 java android repository-pattern android-mvp

我在我的演示项目中使用 MVP,在我的 View ( fragment )中我有两个编辑文本(案例编号和用户名)和按钮。

单击按钮时我想将该 Case 对象插入到数据库中。 因此,首先检查是否存在相同编号的情况。如果它是假的,我会将其保存到数据库并通知用户该案例已保存在数据库中。否则,只是发回消息,该操作失败并用不同的号码重试。

因此对象会经历各个层:“ View ”>“演示者”>“模型”>“存储库”。 在存储库中检查条件并将消息发送回 View ,通过相同的层,反之亦然(存储库>模型>演示者> View )。

我 Log.d 所有类的错误,一切都很好。但当回到 Presenter 时,我的观点是“在空对象引用上”。

从模型调用我的 Presenter 中的方法,但出现错误...

public void sameCaseNumberMessage(String string){

    Log.d(TAG, "message from repository" + string);
    view.showToastMessage(string); //but here, view is  on a null object reference
}

在我看来...

@Inject
BottomFragmentContract.Presenter presenter;

...

@Override
public void onResume() {
    super.onResume();

    presenter.setView(this);
}

...

在我的演示者中...

@Nullable
private BottomFragmentContract.View view;

...

@Override
public void setView(BottomFragmentContract.View view) {

    this.view = view;
    Log.d(TAG, "Hashcode is fine : " + this.view.toString());
}

...

最佳答案

我猜您正在将演示者注入(inject)到模型中,在这种情况下,请检查它是否与您的 View 所持有(并绑定(bind))的实例相同。

简而言之。我认为该模型持有对演示者的新实例的引用,该实例尚未设置 View 。

将演示者标记为单例或(更适合测试)作为构造函数参数传递给模型。

我还想指出,一般来说,只在一个方向上保留强引用是一个好主意。IE:

  • View (强)-> 演示者(强)-> 模型(强)-> 存储库
  • 查看<-(弱)演示者<-(弱)模型<-(弱)存储库

.. 所以.. 所有权强,听众弱;-)

关于java - Android MVP - 演示者中丢失 View 引用 "NullPointerException... null object reference",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50827650/

相关文章:

Java Servlet/Jsp 图像上传以及表单值

android - LinkMovementMethod 导致 EditText 中的编辑问题

android - 内存不足内存泄漏问题

php - 从 PHP JSON 返回 SQL Blob

entity-framework - 使用通用存储库是一种好习惯还是每个实体都应该拥有自己的存储库?

repository-pattern - 在 EF 4.1 上使用 ObjectContext 和 DbContext 的存储库实现之间的区别

ninject - 寻找行为类似于 InRequestScope 的 Ninject 范围

java - 哪些 servlet 是预初始化的好成员?

java - 如何在 Android 中监听 TextView 并对同一个 TextView 进行更改

java - 如何使用 CQRS 进行 BDD?