【问题标题】:Android custom listener for an eventAndroid 自定义事件监听器
【发布时间】:2017-02-18 07:27:04
【问题描述】:

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

声明自定义监听器

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

我有什么遗漏吗?

【问题讨论】:

  • 你从未初始化过modeupdate。您可以查看 this answer 以了解该模式的工作原理。
  • 你应该在一些活动中实现 OnModeUpdate 并在 onEvent() 方法中定义要做什么
  • 你从未调用过setModeupdate,也从未实现过接口

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


【解决方案1】:

NullPointerException是在一个空引用的对象上调用方法引起的,也就是说它没有被初始化。

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

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

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

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

    以上解释了NullPointerException的原因。你从未初始化过modeupdate。在modeupdate 初始化后,onEvent() 方法将在按钮点击时被触发。

    注意:您在代码的注释中写道:“... BreakPoint here,但从未到达。” 在接口声明中无法到达,仅在实现该接口的对象的实例上。


    * 模式的另一个名称是订阅者-发布者模式。
    ** 如果在 fieldactivity 中声明了 OnModeUpdate 接口,则使用 公共类 CustomListener 实现 fieldactivity.OnModeUpdate sup>
    *** 与您对 button 变量所做的相同,方法是在 Button 类之外调用 setOnClickListener()并分配一个监听器,即实现View.OnClickListener接口的对象(fieldactivity

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-28
      • 1970-01-01
      • 2023-03-07
      • 2017-03-20
      • 2011-12-09
      相关资源
      最近更新 更多