android自定义监听器/带回路的回调

时间:2013-12-01 00:31:40

标签: android android-intent

我在我的Android应用程序中实现了一个回调/监听器,如下所示:

public interface class OnListener() {
  public void onReceive();
}

public class CLASSA {
  private OnListener l = new OnListener() {
    @Override
    public void OnReceive() {
      Log.v(TAG, "Received response");
    };
  CLASSB obj = new CLASSB();
  obj.methodA(l);
}

public class CLASSB {
  void methodA(OnListener l) {
    <define a new thread t> {
    loop (<some condition>) {
      l.OnReceive();
    }
    }
    t.start();
  }

现在如果循环正在运行并且CLASSA正在获得连续的回调/响应并且在循环运行时obj被设置为null,我仍然会继续获得回调,即我仍然在我的日志中看到“已接收响应”。为什么?我不应该得到一些例外吗?这背后的原因是什么?

1 个答案:

答案 0 :(得分:0)

我把它变成了一个可运行的Java程序 - 是的,它继续输出“Response Received”。原因是程序仍然维护对ThreadGroup的引用 - 请参阅此answer.其中,仍然会向侦听器维护引用,因为它是run()方法的一部分。在线程之外发生的事情是无关紧要的。

class CLASSB
{
    public void methodA(final OnListener l)
    {
        new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                while (true)
                {
                    l.OnReceive();
                }
            }
        })
                .start();
    }
}
interface OnListener
{
    public void OnReceive();
}

public class CLASSA { public static void main(String[] args) { CLASSB obj = new CLASSB(); OnListener l = new OnListener() { @Override public void OnReceive() { System.out.println("Received response"); } }; obj.methodA(l); obj = null; l = null; } }