2013-02-20 1 views
2

При чтении AsyncTask documentation, часть по правилам Threading, я нашел это:В чем разница между загрузкой и созданием AsyncTask в потоке пользовательского интерфейса?

  • Класс AsyncTask должен быть загружен в потоке пользовательского интерфейса. Это делается автоматически с JELLY_BEAN.
  • Экземпляр задачи должен быть создан в потоке пользовательского интерфейса.
  • execute (Params ...) должен быть вызван в потоке пользовательского интерфейса.

Что подразумевается под "загрузка"? Это не экземпляр или исполнение, поскольку документация говорила об этом позже.

ответ

6

Я не верю, что this answer на самом деле правильный.

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

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

имеет отношение к Java Class Loading. Другими словами, сам AsyncTaskкласс должен быть загружен в основной поток. В Jelly Bean (или позже) это автоматически. Но в старых версиях Android существует вероятность того, что этот класс будет загружен в другой поток, что может вызвать проблемы.

See this Google discussion для получения дополнительной информации. В принципе, существуют условия (например, код с использованием IntentService), который может привести к тому, что AsyncTask будет первым загружен по неправильной (не основной) теме.

Самым простым способом исправить это, до Jelly Bean, кажется, использовать что-то вроде:

Class.forName("android.os.AsyncTask"); 

в onCreate() method приложения, чтобы заставить загрузку классов произойдет, когда вы хотите.


Создание экземпляра AsyncTask, вероятно, что вы думаете, что это ... инстанцировании его:

MyAsyncTask task = new MyAsyncTask(); 

и которые также должны выполняться в основном потоке.

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