【问题标题】:Possible memory leak using Handler?可能使用 Handler 的内存泄漏?
【发布时间】:2011-08-25 19:51:48
【问题描述】:

这种代码会不会导致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 实例仍然被全局消息队列强引用,所以这里可能存在内存泄漏。

我没听错吧?

【问题讨论】:

    标签: android memory memory-management


    【解决方案1】:

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

    【讨论】:

    • runnable有没有可能卡在消息队列中?
    • 我认为没有。看看Looper.loop()MessageQueue.next() 的实现。
    【解决方案2】:

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

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

    作为一种避免内存泄漏的好习惯,尝试将内部类设为静态

    【讨论】:

      猜你喜欢
      • 2013-03-15
      • 2019-02-13
      • 2011-01-03
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多