弱引用对象是静态处理程序中的Garbage Collected

时间:2012-10-10 06:58:18

标签: android nullpointerexception handler weak-references

给出代码

 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
}

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

问题:

当它变为空并进一步继续或者我应该完成活动或应用程序时,有没有办法找回目标?

感谢。

2 个答案:

答案 0 :(得分:6)

使用一个总是需要作为WeakReference引用的对象的原因是什么?

引用用作缓存,而不是自由访问的对象。一旦GC认为不需要WeakReferences就会被擦除,即使需要它们也是如此。

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

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

答案 1 :(得分:0)

请阅读WeakReference的{​​{3}}。直接指出,将尽快收集周参考对象。

所以,你必须使用通常的引用,或SoftReference