управление потоками Android onPause - PullRequest
5 голосов
/ 16 июня 2010

У меня есть класс, который расширяет класс Thread и имеет метод run, реализованный следующим образом.

public void run(){
    while(!terminate){
        if(paused){
            Thread.yield();
        }else{
            accummulator++;
        }
    }
}

Этот поток порожден методом onCreate.

Когда мой пользовательский интерфейс скрыт (когда нажата клавиша Home), мой метод onPause установит для флага приостановки значение true и выдаст шаг. Однако в DDMS я все еще вижу, как uTime потока накапливается и его состояние «работает».

Итак, мой вопрос. Как правильно остановить поток, чтобы он не занимал процессорное время?

Ответы [ 3 ]

4 голосов
/ 17 июня 2010

На самом деле плохая практика - продолжать работу потока после onPause. Причина в том, что после включения onPause ваше приложение может выпасть из памяти в любое время без вашего ведома, поэтому вы не сможете убирать за собой.

Правильный способ сделать это - остановить поток onPause и воссоздать его на Resume. Если вам нужно состояние, вы можете использовать встроенные в Android методы или настройки saveState или другое, чтобы сохранить это.

1 голос
/ 16 июня 2010

Несмотря на то, что вы вызываете thread.yield (), вы находитесь внутри цикла while (), который, вероятно, повторяется тысячи раз в секунду, каждый раз вызывая .yield (), но тот факт, что он выходит из контроль означает, что он использует ресурсы. Если вы добавите туда сообщение Log.d, вы поймете, что я имею в виду.

Я рекомендую использовать Thread.sleep() вместо Thread.yield(). Причина в том, что пока нить спит, она уступает. Плюс ко сну вы получаете дополнительное преимущество, замедляя while() и не используя ресурсы. Интервал сна в 500 мс должен быть достаточным =)

0 голосов
/ 16 июня 2010

Ваша переменная paused, скорее всего, локально кэшируется потоком. Это потому, что он только читается и не изменяется в цикле. Так что происходит то, что компилятор / интерпретатор / джиттер оптимизирует, только читая переменную один раз, а затем только выполняя ветвь else. Вам нужно пометить это поле как volatile, чтобы переменная pause читалась на каждой итерации цикла. Ознакомьтесь с документацией для ключевого слова volatile. Вот некоторая информация о потоке и некоторая информация о синхронизации и параллелизме .

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