用于活动的Android自定义侦听器

时间:2016-10-09 21:26:08

标签: java android design-patterns listener observer-pattern

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

声明自定义侦听器

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()”   在空对象引用上

我有什么遗失的吗?

2 个答案:

答案 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 接口

的对象( fieldactivity

答案 1 :(得分:0)

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

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

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