управление потоком андроида onPause

У меня есть класс, который расширяет класс Потока и реализовал его метод выполнения как так.

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

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

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

Таким образом, мой вопрос. Что надлежащий путь состоит в том, чтобы остановить поток так, чтобы он не израсходовал процессорное время?

5
задан Kwan Cheng 16 June 2010 в 16:19
поделиться

3 ответа

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

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

4
ответ дан 14 December 2019 в 18:59
поделиться

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

0
ответ дан 14 December 2019 в 18:59
поделиться

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

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

1
ответ дан 14 December 2019 в 18:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: