我知道在类中声明的处理程序可能会泄漏内存,因为它包含对其外部类的引用。在这种情况下,我们应该使用带有弱引用的静态嵌套类。
但是如果在方法中声明了处理程序,该怎么办?我遇到了以下情况,并不确定它是否正确实施。有人可以解释或给我一个提示吗?我甚至不知道应该搜索什么。
private void methodA(){
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
methodB();
}
}, 10*1000);
private void methodB(){
//textView holds a reference to a activity
textView.setText("hello");
}
答案 0 :(得分:2)
它可以在某些条件下。如果传递的runnable是匿名或内部类,如在您的示例中,它包含对“this”的隐式引用,并防止“this”被垃圾收集,直到runnable被从队列中处理掉(因此,如果您的方法永远不会运行,就像你的处理程序线程在没有清除队列的情况下被停止一样,它会泄漏)。
如果您担心发生内存泄漏或挂在对象上的条件太长,那么您需要使runnable成为在构造函数中初始化了弱引用的静态类,如:
private static MyRunnable implements Runnable
{
private final WeakReference<MyClass> myClass_weakRef;
public MyRunnable(MyClass myClassInstance)
{
myClass_weakRef = new WeakReference(myClassInstance);
}
@Override
public void run()
{
MyClass myClass = myClass_weakRef.get();
if(myClass != null)
myClass.methodB();
}
}
private void MethodA()
{
Handler handler = new Handler();
handler.postDelayed(new MyRunnable(this), 10*1000);
}
答案 1 :(得分:0)
在方法中创建Handler
不是特例。它属于相同的情况,因为您发布的Message
将一直存在于消息队列中,直到它被处理为止。