给出代码
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
}
但是当目标变为空时,我无法在应用程序中继续进行。
问题:
当它变为空并进一步继续或者我应该完成活动或应用程序时,有没有办法找回目标?
感谢。
答案 0 :(得分:6)
使用一个总是需要作为WeakReference引用的对象的原因是什么?
引用用作缓存,而不是自由访问的对象。一旦GC认为不需要WeakReferences就会被擦除,即使需要它们也是如此。
此外,WeakReference永远不会变为空。它的内容可能会变为null,但引用本身仍然是有效的WeakReference。它将为空,但不为空。空对象和空对象之间存在差异:仍在内存中分配空对象。
我只是删除WeakReference并将MainActivity存储为完整对象。如果您遇到内存泄漏,请修复内存泄漏,而不是尝试解决它们。
答案 1 :(得分:0)
请阅读WeakReference
的{{3}}。直接指出,将尽快收集周参考对象。
所以,你必须使用通常的引用,或SoftReference
。