【问题标题】:Triggering event from Class A to Class B using interface in Java使用Java中的接口从A类触发事件到B类
【发布时间】:2015-12-03 13:12:17
【问题描述】:

假设我定义了一个具有这样接口的类:

public class myClass {

    public void test() {
        //here I want to trigger `onStartListener`
    }

    interface OnStartListener {
        public void onStart();
    }
}

和我这样定义的 B 类:

public class ClassB implements myClass.OnStartListener {
    public void ClassB() {
        myClass test1 = new myClass();
        myClass.test();
    }

    @Override
    public void onStart() {
        System.out.println("start triggered");
    }
}

如何从myClasstest 方法触发OnStartListener 以便ClassB 可以处理?

【问题讨论】:

    标签: java interface listener


    【解决方案1】:

    是的,你需要订阅你的监听器并调用A类中的方法:

    public class ClassB implements myClass.OnStartListener {
        public void ClassB() {
            myClass test1 = new myClass(this);
            //test1.setListener(this);
            myClass.test();
        }
    
        @Override
        public void onStart() {
            System.out.println("start triggered");
        }
    }
    

        public class myClass {
        OnStartListener myListener;
    
        public myClass(OnStartListener myListener) {
                 this.myListener = myListener;
            }
        public void test() {
                //here I want to trigger `onStartListener`
                myListener.onStart();
        }
    
            interface OnStartListener {
                public void onStart();
        }
    }
    

    【讨论】:

    • 怎么样?我想从myClass 触发,而 ClassB 已经订阅监听该事件。
    • 是否有可能不使用setListener,而是在构造函数中直接使用this 来实例化OnStartListener?例如。像这样:this.myListener = (OnStartListener) this;
    • 我已经看到你更新的答案......但我的意思是。我正在初始化myClass 已经在ClassB 中,就像这样...new myClass()。如果我在 myClass 构造函数中直接使用this,而不是在其中传递引用:this.myListener = (OnStartListener) this,这会起作用吗?因为我认为它已经引用了发起者。
    • this.myListener = 这不起作用,因为 myClass 正在接收一个接口,但我的 Class 没有实现该接口。
    【解决方案2】:

    看看框架是如何处理监听器的。基本上你需要用myClass“注册”监听器实例(ClassB实例)并调用onStart()

    ClassB 可能包含一个在循环中使用的List<OnStartListener>,并在每个元素上调用onStart()。注册意味着将ClassB 的实例分配给该列表。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-12
      • 2015-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-03
      相关资源
      最近更新 更多