Я в настоящее время разрабатываю приложение для Android, оно должно загрузить содержание с Интернета. Я использую поток, чтобы сделать это и затем назвать runOnUiThread метод для обновления GUI.
Вместо того, чтобы запускать новый поток для каждого действия обновления, я бы создал один поток для всей фоновой загрузки, который зацикливается и загружает контент, выстроенный в очередь. Это гарантирует, что вы не загружаете контент одновременно, а также экономит ресурсы.
В графическом интерфейсе вы просто ставите в очередь запрос на обновление всякий раз, когда пользователь предлагает вам, и можете прервать текущую загрузку, вызвав HttpRequestBase.abort
в экземпляре метода http. Фоновый поток должен получить и перехватить SocketException
и перейти к следующему запросу в очереди.
Чтобы завершить фоновый поток, вам просто нужно завершить его цикл. Вы можете использовать классы Looper
и Handler
, чтобы помочь вам со всем вышеперечисленным, упомянутый вами класс HandlerThread
- это просто удобный класс для создания потока, который имеет лупер
.
Проблема с прерыванием
потока заключается в том, что оно не вырвет вас из блокирующего запроса ввода-вывода, а правильная обработка InterruptException
может быть сложной. Поэтому, в зависимости от ситуации, я бы сказал, что да, лучше завершить поток, вернувшись из его метода run
.
Вы можете использовать IntentService для запуска фоновых операций, служба будет работать как «обработчик рабочей очереди» и будет выполнять ваши вызовы по порядку.
На этой неделе я обнаружил AsyncTask и заменяю Thread на AsyncTask в каком-то месте своей программы,
Здесь у вас есть документ и образец, очень простые в использовании:
http://developer.android.com/reference/android/os/AsyncTask.html
, когда я использовал поток, графический интерфейс был заблокирован, а теперь он не заблокирован.
И можно отменить AsyncTask (но я никогда не пробовал)