我尝试在我的一个 Activity 中实现观察者模式,但在调用 notifyObservers
时遇到以下异常:
java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference
at java.util.Observable.notifyObservers(Observable.java:131)
at models.database.User.setPending(User.java:137)
我的实现非常简单:模型 User
是可观察的, Activity 是观察者(这无关紧要,因为永远不会到达 Activity 代码)。我的目标是在字段属性的每次更改时都收到通知。
这是 User
类中的相关部分:
public class User extends Observable implements Parcelable {
private boolean pending;
public void setPending(boolean pending) {
synchronized (this) {
this.pending = pending;
}
setChanged();
notifyObservers(this);
}
}
我的实现或我对这里的理解有什么缺陷吗?我不知道出了什么问题,我更愿意解决它而不是转向 RX 实现。
编辑:这是 MainActivity
代码,它永远不会到达:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//Get session variables from previous activity (LoginActivity/SplashActivity)
user = getIntent().getExtras().getParcelable(getString(R.string.e_user)); //Receiving user from previous activity, assured to be non-null
//Add observer on user, so we'll be able to update drawer in case of modification
user.addObserver(this);
}
@Override
public void update(Observable observable, Object o) {
drawerBuilder.setUser(user);
}
最佳答案
我继续挖掘,发现我用来发出 HTTP 请求的库 Retrofit 根本不调用构造函数,而且到目前为止我没有遇到这个错误,因为我收到了 User
在 LoginActivity
/SplashActivity
中,并使用 extras 将其传递给 MainActivity
,从而使用 User(Parcel in)
构造函数(我唯一拥有的)。
向 User
类添加一个空的构造函数解决了这个问题。但是,我仍然不明白为什么 Retrofit 之前没有抛出任何异常。
关于java - Observable.notifyObservers 空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41367350/