我正在尝试在更新整数值时触发事件,但它失败了。这是我正在使用的代码:
声明自定义侦听器
public class fieldactivity extends AppCompatActivity implements View.OnClickListener {
OnModeUpdate modeupdate; //Create custom listener for mode update
int mode = 1;
模式更新代码
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.fieldsignals);
Button button = (Button) findViewById(R.id.mode_rotate_button);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case(R.id.rotate_button):
mode += 1;
modeupdate.onEvent(); //Fire Custom Lisentener - Fails On This Line
}
}
接口代码
public interface OnModeUpdate {
//BreakPoint here, but is never reached
void onEvent();
}
public void setModeupdate(OnModeUpdate eventListener) {
modeupdate = eventListener;
}
我得到的错误是:
java.lang.NullPointerException:尝试调用接口方法 “无效 alveare.com.plcsignalconverter.fieldactivity $ OnModeUpdate.onEvent()” 在空对象引用上
我有什么遗失的吗?
答案 0 :(得分:0)
listener 的更多通用名称是 observer *设计模式。说出你试图实现的模式术语是使观察者(即modeupdate
)在可观察对象中发生事件(整数值变化)时得到通知,即fieldactivity
与之交互用户。
观察者modeupdate
可以是任何类型,并且必须实现OnModeUpdate
接口才能从可观察对象接收通知。 E.g。**
public class CustomListener implements OnModeUpdate {
@Override
public void onEvent() {
...
}
}
现在,您可以通过以下选项之一(根据您的业务逻辑)在可观察对象(modeupdate
)中分配观察者(fieldactivity
):
使用"外部"初始化modeupdate
类实例
OnModeUpdate modeupdate = new CustomListener();
使用modeupdate
类
fieldactivity
modeupdate = new OnModeUpdate() {
@Override
public void onEvent() {
// Do stuff regarding the mode change
}
};
通过在modeupdate
实例***的引用上调用fieldactivity
,从setModeupdate(...)
类之外分配fieldactivity
。
上面说的解释了NullPointerException
的原因。你从未初始化modeupdate
。初始化modeupdate
后,点击按钮即会触发onEvent()
方法。
注意:您在代码的评论中写道:" ... BreakPoint在这里,但从未到达。" 它不能是在接口声明中到达,仅在实现接口的对象的实例上。
*模式的另一个名称是Subscriber-Publisher模式。
**如果在 fieldactivity 中声明 OnModeUpdate 接口,请使用公共类CustomListener实现fieldactivity.OnModeUpdate
***与按钮变量相同,方法是在 Button 类之外调用 setOnClickListener()并分配一个监听器,即实现 View.OnClickListener 接口
答案 1 :(得分:0)
NullPointerException是由null referenc对象调用方法引起的,该对象是一个尚未初始化的对象。
在您的情况下,null对象是modeUpdate
。尝试在您的活动的onCreate()
中对其进行初始化。
modeupdate = new OnModeUpdate() {
@Override
public void onEvent() {
/**
* Write the code to handle the case
*/
}
};