繁体   English   中英

为什么我的处理程序引用空活动?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM