我知道在类中声明的处理程序可能会泄漏内存,因为它持有对其外部类的引用。在这种情况下,我们应该使用弱引用的静态嵌套类。
但是,如果在方法内部声明处理程序会怎样。我遇到了以下情况,但不确定它是否正确实现。有人可以解释或给我提示吗?我什至不知道我应该搜索什么。
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");
}
最佳答案
在一定条件下可以。如果传递的 runnable 是匿名类或内部类,如您的示例所示,它包含对“this”的隐式引用并防止“this”被垃圾收集,直到 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);
}
关于android - 方法内部的处理程序会泄漏内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22162642/