Потоки в Android - PullRequest
       20

Потоки в Android

9 голосов
/ 13 июня 2010

Я сейчас занимаюсь разработкой приложения для Android, оно требует загрузки контента из интернета.Я использую поток, чтобы сделать это, а затем вызываю метод runOnUiThread для обновления графического интерфейса.

  1. Я поместил в него меню обновления, если пользователь попытался обновить содержимое, поток загрузки будет создан и запущен.Проблема в том, что, как я могу управлять порядком потоков, мне нужно принять ответ на последний запрос и отказаться от предыдущих запросов потоков, если еще были запущены некоторые другие запросы, потому что параметры запроса могли быть изменены пользователем.В настоящее время я использовал threadId, чтобы сделать это, когда поток закончил, он проверит свой threadId, если это был последний записанный, затем он получит контроль и выдаст ответ. Мой вопрос заключается в том, есть ли какое-либо иное правильное решение для этого?
  2. Нужно ли останавливать потоки при выходе пользователя из приложения? Я помню, что в какой-то книге говорилосьчто не пытайтесь остановить поток вручную и дождаться завершения - это хорошая практика, это правда?Должен ли я остановить их, вызвав метод "stop" или "interrupt"?
  3. Я прочитал несколько документов о многопоточности в Android и обнаружил класс HandlerThread , что это?В какой ситуации мне нужно это использовать?

Ответы [ 3 ]

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

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

В графическом интерфейсе вы просто ставите в очередь запрос на обновление всякий раз, когда пользователь просит вас, и можете прервать текущую загрузку, вызвав HttpRequestBase.abort в экземпляре метода http.Фоновый поток должен получить и поймать SocketException и перейти к следующему запросу в очереди.

Чтобы завершить фоновый поток, вам просто нужно завершить его цикл.Вы можете использовать классы Looper и Handler, чтобы помочь вам со всем вышеперечисленным, класс HandlerThread, который вы упомянули, является просто удобным классом для создания потока, которыйимеет Looper.

Проблема с interrupt в потоке состоит в том, что он не избавит вас от блокирующего запроса ввода-вывода и правильной обработки InterruptExceptionможет быть сложным.Поэтому, в зависимости от ситуации, я бы сказал, что да, лучше завершить поток, вернувшись из метода run.

2 голосов
/ 18 июня 2010

Я обнаружил на этой неделе AsyncTask и заменил Thread на AsyncTask в каком-то месте моей программы,
У вас есть документ и пример, очень прост в использовании:
http://developer.android.com/reference/android/os/AsyncTask.html
, когда я использовалGUI потока был заблокирован, и теперь он не заблокирован.
И можно отменить AsyncTask (но я никогда не пробую)

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

Вы можете использовать IntentService для запуска фоновых операций, служба будет работать как «процессор рабочей очереди» и будет выполнять ваши вызовы по порядку.

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