2011-08-25 31 views
2

这种代码会导致Android内存泄漏吗?使用处理程序可能的内存泄漏?

class MyActivity extends Activity { 

    Runnable myRunnable =new Runnable() { 
     public void run() { 
      // Do something here 
     } 
    }; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.my_activity); 
     Handler = new Handler(); 
     Handler.postDelayed(myRunnable, 2000); 
    } 
} 

在上面的代码,myRunnable具有较强的参考MyActivity,并加入myRunnable到线程消息队列。当MyActivity关闭时,MyActivity实例仍然被全局消息队列强引用,因此可能存在内存泄漏。

我理解它吗?

回答

1

我认为没有内存泄漏。 Runnable将在2秒内被调用,此消息将从MessageQueue中删除。

+0

是否有可运行的卡在消息队列中的任何可能性? – Kai

+0

我觉得没有。看看'Looper.loop()'和'MessageQueue.next()'的实现。 – Michael

0

实际上,消息可能会卡在队列中。

如果您的MyRunnable中有一个长时间运行的操作,将会有activity.finish()系统将没有时间从队列中删除您的消息,并且它会在您下次运行时执行(假设完成()未完全关闭您的应用程序)

作为一个很好的做法,以避免内存泄漏尝试进行内部类的静态