[英]Why does Android Studio warn about a handler reference leak in this Activity Handler code?
[英]Why does my Handler reference a null Activity?
首次从干净状态进入应用程序后,在处理程序内部,该处理程序处理MSG_PULLED操作,但是对main的引用为null。 弱引用不为null。 这怎么可能发生?
这篇文章的启发: 此Handler类应该是静态的,否则可能会发生泄漏:IncomingHandler
static class MainHandler extends Handler {
private final WeakReference<MainActivity> wMain;
static int angle=0;
public MainHandler(MainActivity main) {
super();
this.wMain = new WeakReference<MainActivity>(main);
}
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
MainActivity main = wMain.get();
int what = msg.what;
if(what == MSG_PULLED) {
main.startAnim();
}
}
}
以及我如何启动处理程序:
static MainHandler mainHandler;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mainHandler = new MainHandler(this);
mainHandler.sendEmptyMessageDelayed(MSG_PULLED,500);
}
应用程序中的Activity
实例会定期销毁,例如在旋转显示时会创建新的Activity
实例。
现在,在那种情况下应该发生的是旧实例被垃圾回收,而只有新实例存在。 如果您将旧的遗留在附近,则会造成泄漏。
由于Handler
不当作垃圾收集,直到他们有没有更多的消息(?),他们可以住长于Activity
,他们创造了女巫,这通常会导致漏水的旧Activity
(直到Handler
可以收集),因为Handler
通常有很强的参考他们的Activity
。
您的代码中的WeakReference
方式通过仅保持与Activity
的弱链接来避免该问题,从而避免了垃圾回收。
问题在于您以错误的方式使用了get()
方法: get()
仅会在原始对象存在时返回它。 当它消失时,您得到null
。 此处:“ Activity
将在其仍处于Activity
时存在(由系统确定)。
null
也不是一个大问题:当您获得null
您的Activity
实例将不再处于活动状态(也许创建了一个新实例,也许它已经完全消失了),因此您无法对其进行任何有用的处理。 即使您仍然有参考,动画也不会显示。
基本上像下面这样,您的问题就解决了
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
MainActivity main = wMain.get();
// message arrived after activity death
if (main == null) return;
int what = msg.what;
if(what == MSG_PULLED) {
main.startAnim();
}
}
WeakReference
本身( wMain
)不为null,因为它本身是作为成员变量强烈引用的。 在某些时候,仅其中的内容可以/为null
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.