我在我的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,我仍然会继续获得回调,即我仍然在我的日志中看到“已接收响应”。为什么?我不应该得到一些例外吗?这背后的原因是什么?
答案 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;
}
}