针对事件的Android自定义侦听器

我正在尝试在更新整数值时触发事件,但它失败了。 这是我正在使用的代码:

声明自定义侦听器

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:尝试在null对象引用上调用接口方法’void alveare.com.plcsignalconverter.fieldactivity $ OnModeUpdate.onEvent()’

有什么我想念的吗?

NullPointerException是由null referenc对象调用方法引起的,该对象是一个尚未初始化的对象。

在您的情况下,null对象是modeUpdate 。 尝试在活动的onCreate()中初始化它。

 modeupdate = new OnModeUpdate() { @Override public void onEvent() { /** * Write the code to handle the case */ } }; 

监听器的更通用名称是观察者 *设计模式。 说到模式术语,你想要实现的是使观察者,即模式modeupdate ,在可观察对象内发生事件(整数值变化)时得到通知,即与用户交互的fieldactivity

观察者modeupdate可以是任何类型,并且必须实现OnModeUpdate接口才能从可观察对象接收通知。 例如**

 public class CustomListener implements OnModeUpdate { @Override public void onEvent() { ... } } 

现在,您可以通过以下选项之一(根据您的业务逻辑)在可观察对象( fieldactivity )中分配观察者( modeupdate ):

  • 使用“外部”类实例初始化modeupdate

     OnModeUpdate modeupdate = new CustomListener(); 
  • 使用modeupdate类中的匿名内部类实例初始化modeupdate

     modeupdate = new OnModeUpdate() { @Override public void onEvent() { // Do stuff regarding the mode change } }; 
  • 通过在对fieldactivity实例***的引用上调用setModeupdate(...) ,从fieldactivity类外部分配modeupdate

上面说明了NullPointerException的原因。 你从未初始化modeupdate 。 在初始化modeupdateonEvent()方法将在单击按钮时触发。

注意:您在注释中写入了代码: “// BreakPoint在这里,但永远不会到达。” 它不能在接口声明中到达,只能在实现接口的对象的实例上到达。


*模式的另一个名称是Subscriber-Publisher模式。
**如果在fieldactivity中声明了OnModeUpdate接口,则使用公共类CustomListener实现fieldactivity.OnModeUpdate
***与通过调用Button类之外的setOnClickListener()并分配侦听器(即实现View.OnClickListener接口的对象( fieldactivity ))对按钮变量的操作相同