Блокировка активности Android прекращается до завершения очистки - PullRequest
1 голос
/ 03 января 2012

У меня есть рабочий поток, выполняемый моей деятельностью. При выходе из действия (например, onPause ()) я отправляю сообщение в этот поток, и оно должно закончиться вскоре (миллисекунды) после, если что-то пойдет не так. Обычно я бы использовал join () в onPause (), но в этом случае этот поток должен использовать поток пользовательского интерфейса для выполнения последовательности выключения (закрытие дескриптора файла Accessory не работает из любого другого потока, который кажется) , Таким образом, попытка заблокировать поток пользовательского интерфейса приведет к взаимоблокировке. Я ищу решение, которое каким-то образом откладывает выход из приложения до завершения потока. Возможно, если бы я мог просто прервать выход в таком случае, я мог бы позже вызвать финиш () вручную, но я не уверен, что это (прерывание) можно сделать.

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

Ответы [ 2 ]

1 голос
/ 04 января 2012

Как вы сказали, вы не можете удерживать поток пользовательского интерфейса в ожидании бесконечного останова фонового потока.

Вы можете сделать следующие вещи.

1) Прервать поток в onPause (). (Это не сохранит никакой информации, если вы захотите во время очистки)

2) Если вы хотите сохранить некоторую информацию и выполнить чистый выход, вы можете запустить службу Androiod в onPause () и выполнить очистку там. (Проверьте наличие логического флага в теме) пример: псевдо-пример

void run(){
while(true){
   if(bExit){
    doCleanupWork();
   }
  //Do work
  doWork();

  }
}

void doCleanupWork(){
startCleanupService();
}

void onPause(){
bExit = true;
}

редактирует

3) Переопределите onBackPressed () класса Activity, чтобы он не выходил напрямую. Запустите AsyncTask и покажите пользователю диалоговое окно, указывающее обработку, когда вызовы очистки происходят в doInBackground (). Если вы не уверены, что очистка может повесить, вам нужно перепроверить код и при необходимости прервать поток после истечения времени ожидания.

0 голосов
/ 04 января 2012

объявить обработчик в потоке пользовательского интерфейса. Когда другой поток завершит работу, отправьте (пустое) сообщение из другого потока в этот обработчик, что вызовет метод handleMessage для выполнения в потоке пользовательского интерфейса. Выполните окончательную очистку пользовательского интерфейса в handleMessage.

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