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) {
        ..
        }
 }
}

为了避免 NullPoinetrException 我可以使用:

if(target != null {
     // do something
}

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

问题:

有没有办法在目标变为空时恢复目标并继续进行,或者我应该完成活动或应用程序?

谢谢。

4

2 回答 2

6

使用始终需要作为 WeakReference 引用的对象背后的原因是什么?

引用被用作缓存,而不是作为可以自由访问的对象。WeakReferences 将在 GC 认为不需要它们时被擦除,即使它们将被需要。

此外,WeakReference 永远不会变为 null。它的内容可能会变为 null,但引用本身仍然是有效的 WeakReference。它将为空,但不为空。空对象和空对象之间存在区别:空对象仍然分配在内存中。

我只是删除 WeakReference 并将 MainActivity 存储为一个完整的对象。如果您遇到内存泄漏,请修复您的内存泄漏,而不是尝试解决它们。

于 2012-10-10T07:04:41.660 回答
0

请阅读概述WeakReference直接指出,周引用下的对象将尽快被收集。

因此,您必须使用通常的参考,或SoftReference.

于 2012-10-10T07:09:19.397 回答