Это очень по-разному.
- Первое ВСЕ пользовательское взаимодействие выполняется в основном потоке, а также во всех графических работах.
- Второе
AsyncTask
предназначено для коротких всплесков выделенного действия, например загрузки файла.или загрузка некоторых данных. - В-третьих, поскольку все пользовательский интерфейс и взаимодействия с пользователем выполняются в главном потоке, если вы начнете помещать данные в этот поток, устройство будет зависать и меньше реагировать на команды пользователя.
Единственная причина, по которой вы хотите что-то запустить в потоке пользовательского интерфейса, - это взаимодействие с виджетами.Кроме этого, если вы хотите выполнять длительную обработку, используйте AsyncTask
.
Edit:
Вы можете загрузить свои данные в отдельном потоке, и у меня нет проблем с этим.Проблема возникает, когда вы хотите обновить пользовательский интерфейс.В одиночку невозможно изменить пользовательский интерфейс из дочернего потока.Вместо этого вам придется создать либо обработчик, связанный с потоком пользовательского интерфейса, либо создать новый поток, предназначенный для выполнения в потоке пользовательского интерфейса (как в вашем примере).Это не только утомительно, но и трагически трата ресурсов.AsyncTask
позаботится об этом просто и эффективно.
Что касается вашего последнего пункта, вы правы.AsyncTask
имеет доступ к основному потоку в pre / postExecute.Однако обработка (основной источник задержки пользовательского интерфейса), которую выполняет задание, не выполняется.При выполнении задания на пользовательский интерфейс будет влиять только то, что вы рисуете, в отличие от необходимости ждать, пока задание завершит свою работу, и любого рисунка, который он хочет сделать.