Android 方法中的处理程序会泄漏内存吗?
我知道类中声明的处理程序可能会泄漏内存,因为它持有对其外部类的引用。在这种情况下,我们应该使用弱引用的静态嵌套类 但是,如果在方法中声明了处理程序,该怎么办呢。我面对下面的情况,不确定这是一个正确的实施。有人能给我解释一下吗?我甚至不知道我应该寻找什么Android 方法中的处理程序会泄漏内存吗?,android,memory-leaks,handler,Android,Memory Leaks,Handler,我知道类中声明的处理程序可能会泄漏内存,因为它持有对其外部类的引用。在这种情况下,我们应该使用弱引用的静态嵌套类 但是,如果在方法中声明了处理程序,该怎么办呢。我面对下面的情况,不确定这是一个正确的实施。有人能给我解释一下吗?我甚至不知道我应该寻找什么 private void methodA(){ Handler handler = new Handler(); handler.postDelayed(new Runnable() { @
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被处理出队列为止(因此,如果您的方法从未运行过,例如如果处理程序线程在未清除队列的情况下停止,它将泄漏)
如果您担心内存泄漏发生或挂在对象上的时间过长,则需要将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);
}
私有静态MyRunnable实现Runnable
{
私人最终WeakReference myClass_weakRef;
公共MyRunnable(MyClass myClassInstance)
{
myClass_weakRef=新WeakReference(myClassInstance);
}
@凌驾
公开募捐
{
MyClass MyClass=MyClass_weakRef.get();
如果(myClass!=null)
myClass.methodB();
}
}
私有无效方法a()
{
Handler=newhandler();
handler.postDelayed(新的MyRunnable(this),10*1000);
}
因此,在处理消息之前,“文本视图”和活动不能是gc?