Android MVP - 在演示者中丢失视图引用" NullPointerException ... null对象引用"

时间:2018-06-13 00:38:29

标签: java android repository-pattern android-mvp

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

在按钮上单击我想将该Case对象插入数据库。 所以,首先检查是否有相同数字的情况。如果它是假的,我会将它保存到数据库并通知用户案例保存在数据库中。否则,只是发回消息,该操作失败并再次尝试使用不同的号码。

因此,对象遍历图层,视图&gt; <演示者>型号&gt;库。 在Repository中检出条件并将消息发送回视图,通过相同的层,但反之亦然(Repository&gt; Model&gt; Presenter&gt; View)。

我记录所有错误的类,一切都很好。但当它回到Presenter时,我会在空对象引用上得到#34;对于我的观点。

在我的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());
}

...

1 个答案:

答案 0 :(得分:0)

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

简而言之。我认为模型正在保存对尚未设置视图的演示者新实例的引用。

将演示者标记为单例,或(更好地进行测试)将其作为构造函数参数传递给模型。

我还要指出,通常最好只在一个方向上保留强引用。.IE:

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

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