2013-03-16 3 views
1
new Thread(new Runnable(){ 

}).run(); 

противразница между новой и тему AsyncTask

new AsyncTask().execute(); 

Я был под впечатлением, они были то же самое, как начать новый рабочий поток, но это не так?

Причина, по которой я спрашиваю, заключается в том, что если я попытаюсь выполнить какое-либо сетевое подключение, используя new Thread(), я получаю NetworkOnMainThreadException, но когда я помещаю этот же код в задачу async, я этого не понимаю.

еще один пример этого различия с помощью Google Maps API v2, где все участки/шоу/Шкуры должны быть сделаны на main thread, но если я использую new Thread() скрыть показать маркеры/появляются хорошо, но если я пытаюсь показать/скрыть в async-задаче, я получаю исключение, говоря, что это нужно сделать в основном потоке.

делает new Thread() действительно не начинается рабочая нить ??

EDIT

не знаю, почему это было закрыто, так как ссылки при условии, что я прочитал и не ответил на мой вопрос, и ничего не упоминает об использовании run() против start() который не ответил на мой вопрос

+0

Я прочитал те, и они не объясняют мой вопрос – tyczj

ответ

6

Если вы вызываете run() вместо start(), он запускается в потоке, из которого он был вызван. Если вы вызываете start(), то он создает новый поток. Вот почему вы получаете ошибку, потому что вы вызываете .run()

+0

ahh, я вижу, что это разница, тогда спасибо – tyczj

0

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

В случае AsyncTask вы можете загрузить данные с сервера в doInBackground() в этом методе и обновить графический интерфейс пользователя в postExecute().

AsyncTask обеспечивает правильное и простое использование нити пользовательского интерфейса. Этот класс позволяет выполнять фоновые операции и публиковать результаты в потоке пользовательского интерфейса без необходимости манипулировать потоками и/или обработчиками.

+0

Я понимаю это, но почему разница в том, что я могу и не могу сделать в каждом – tyczj

0

Исключение NetworkOnMainThreadException происходит из-за того, что вы делаете сетевой вызов в основном потоке пользовательского интерфейса.

Если вы используете AsyncTask, вы можете избавиться от этого исключения. Из документации AsyncTasks идеально подходит для коротких операций (максимум за несколько секунд). Если вам нужно поддерживать потоки в течение длительного времени, настоятельно рекомендуется использовать различные API, предоставляемые java.util. одновременный pacakge, такой как Исполнитель, ThreadPoolExecutor и FutureTask.

http://developer.android.com/reference/android/os/AsyncTask.html.

http://android-developers.blogspot.in/2009/05/painless-threading.html. Статья по ссылке имеет хорошее объяснение по этой теме.

Альтернативой AsyncTask является RoboSpice. https://github.com/octo-online/robospice.

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