2013-03-30 3 views
0

В настоящее время я пишу и андроид-приложение, и я использовал HttpClients и эти классы. Я потратил 2 часа, пытаясь исправить некоторые ошибки, пока не прочитал сообщение, в котором говорилось, что вы не можете выполнить эту операцию в основном потоке. Поэтому они предложили использовать AsyncTask.Операции и потоки Android

Так что мой вопрос: как узнать, какие операции следует выполнять в другой теме? есть ли список, где я могу их прочитать?

Любая информация была бы хорошей, спасибо заранее.

ответ

2

Сетевое исключение является единственным исключением, которое будет выброшено в android, блокируя UI-Thread. Таким образом, вы должны учитывать 3 правила, программируя в android.

Не допускайте выполнения операций с ручкой UI-Thread, для выполнения которой потребуется более 5 секунд.

Не позволяйте широковещательному приемнику обрабатывать операции, которые занимают более 20 секунд, чтобы завершить onReceive().

И не обрабатывайте сетевые операции в UI-Thread.

0

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

0

Как упоминал Гейб, вы должны выполнять тяжелые задания в отдельных потоках.

Есть две важные вещи об андроидных потоках.

1 является общими нитями .. (нить, что делать то, что вы спрашиваете)

2 является щий нитью ... (нить, которая слушает пользователь inreaction и рисует Ui)

вы можете измените ui (действие Views) только через нить ui.

с другой стороны после соты запрещается делать http-запросы в основной теме. (это называется строгим режимом)

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

Надеюсь, это вам поможет.

1

Как и другие ответы сказали, Android не поточно, что означает:

  • Вы не можете манипулировать пользовательский интерфейс из фонового потока
  • Вы не можете делать тяжелые задачи в потоке пользовательского интерфейса

Другие операции такого рода могут включать обработку больших объемов данных/манипулирование базой данных/HTTP-запросы/управление сетью. Действительно, я считаю, что все, что не требует потока пользовательского интерфейса, но требует большого времени обработки, должно быть перемещено в отдельный поток.

Это логично, потому что если вы будете выполнять тяжелую обработку, пользователь почувствует задержку, и пользовательский опыт будет скомпрометирован (и, конечно, может быть определенно использован для перегрузки системы и т. Д.). Следовательно, система убьет процесс и выдаст сообщение об ошибке сот.

В результате вы хотите использовать задачу Async.

Async Task действительно просто открывает новую тему, на которой вы можете выполнять тяжелую обработку или сетевые подключения. Для сетевых подключений я рекомендую использовать AsyncClients like this one, которые реализуют AsyncTask в более удобном для вас формате. Существуют также библиотеки, такие как UniversalImageLoader, которые позволят вам загружать изображения в сетки/списки.

Я также настоятельно рекомендую вам прочитать official Android documentation discussing this, и есть полезный post on the Android blog об этом. Наконец, мне кажется, что this post может быть вам полезен, так как он может содержать ошибку, с которой вы столкнулись (ошибка, потому что вы выполнили операцию в потоке пользовательского интерфейса).

Другие ресурсы Я нашел:

В заключение, here is an example of an AsyncTask being used. (красиво поставленный ответ от @Graham Smith).

3

A NetworkOnMainThreadException возникает, когда приложение пытается выполнить сетевую операцию в своем основном потоке. Это делается только для приложений, ориентированных на SDK Honeycomb или выше. Приложениям, ориентированным на более ранние версии SDK, разрешено создавать сети по своим основным потокам цикла событий, но это сильно обескураживает.

Некоторые примеры других операций, ICS и HoneyComb не позволяют выполнять в потоке пользовательского интерфейса являются:

  1. Открытие соединения сокетов (то есть новое гнездо()).
  2. HTTP-запросы (т. Е. HTTPClient и HTTPUrlConnection).
  3. Попытка подключения к удаленной базе данных MySQL.
  4. Загрузка файла (т. Е. Downloader.downloadFile()).

Если вы пытаетесь выполнить любую из этих операций в потоке пользовательского интерфейса, вы должны обернуть их в рабочий поток. Самый простой способ сделать это - использовать AsyncTask, что позволяет выполнять асинхронную работу с вашим пользовательским интерфейсом. AsyncTask выполнит операции блокировки в рабочем потоке и опубликует результаты в потоке пользовательского интерфейса, не требуя, чтобы вы сами обрабатывали потоки и/или обработчики.

Смежные вопросы