我在我的演示项目中使用 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/