Возможная утечка памяти при использовании Handler? - PullRequest
2 голосов
/ 25 августа 2011

Будет ли такой код вызывать утечку памяти в 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 по-прежнему активно ссылается на глобальную очередь сообщений, поэтому здесь может быть утечка памяти.

Я правильно понял?

Ответы [ 2 ]

1 голос
/ 26 августа 2011

Я думаю, что нет утечки памяти. Runnable будет вызван через 2 секунды, и это сообщение будет удалено из MessageQueue.

0 голосов
/ 14 апреля 2014

На самом деле существует вероятность того, что сообщение может застрять в очереди.

Если у вас в MyRunnable будет длительная операция, в которой будет система Activity.finish (), у вас не будет времени удалить ваше сообщение из очереди, и оно будет выполнено при следующем запуске вашей активности (при условии завершения ( ) не закрывал ваше приложение полностью)

Во избежание утечек памяти попробуйте сделать статические внутренние классы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...