静态Handler中的WeakReference对象已被垃圾回收。

3

给定以下代码

 private static class MyHandler extends Handler 
 {
       private final WeakReference<MainActivity> mTarget;
       MyHandler(MainActivity intarget) {
       mTarget = new WeakReference<MainActivity>(intarget);
 }

 @Override
 public void handleMessage(Message msg) 
 {
       MainActivity target = mTarget.get();  // target becomes null will causes null      pointer exception
       switch (msg.what) {
        ..
        }
 }
}

为了避免NullPointerException,我可以使用以下方法:
if(target != null {
     // do something
}

但是当目标变成null时,我无法在应用程序中继续进行。

问题:

是否有办法在目标变为空时重新获取它并继续执行,还是应该结束活动或应用程序?

谢谢。

2个回答

6
使用WeakReference作为引用对象的原因是什么?
引用对象被用作缓存,而不是随意访问的对象。即使它们将被需要,WeakReferences也会在GC认为它们不再需要时被清除。
另外,WeakReference永远不会变成null。它的内容可能会变成null,但是引用本身仍然是一个有效的WeakReference。它将是空的,但不是null。空对象和null对象之间有区别:空对象仍然分配在内存中。
我只会删除WeakReference并将MainActivity存储为完整对象。如果您遇到内存泄漏,请修复您的内存泄漏问题,而不是尝试规避它们。

0
请阅读WeakReference概述。它明确指出,弱引用下的对象将尽快被收集。
因此,您必须使用常规引用或SoftReference

为了避免内存泄漏,我使用了弱引用(weakReference),正如Romain Guy在这篇帖子中所描述的那样。软引用(SoftReferences)不需要比弱引用更有区别,但是软引用会一直存在,直到内存变得很低。因此,是否最好使用强引用,并且如何检查是否存在内存泄漏? - Praveen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接