Подтвердить что ты не робот

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

Надеюсь, кто-то может объяснить это мне или указать мне на ресурс, который я могу прочитать, чтобы узнать больше. Я создаю приложение, которое использует ListView и пользовательский адаптер списка, который я смоделировал из одного из многих доступных в Интернете учебных пособий, таких как этот:

http://www.softwarepassion.com/android-series-custom-listview-items-and-adapters/

Все прошло отлично. Однако каждый пример того, как это сделать, запускает процесс построения списка объектов, которые будут отображаться, и сбора необходимых данных по отдельным потокам.

Я хочу знать, почему/Не могли бы вы просто положить все в onCreate? Я не вижу причины, по которой вам понадобятся отдельные потоки, чтобы это произошло. Есть ли какая-то общая форма/стандарт, когда/что мне нужно запускать на определенных потоках?

4b9b3361

Ответ 1

Документы Android об этом очень хороши, как и в большинстве случаев.

Результат: пользовательский интерфейс всегда должен быть отзывчивым. Итак if you have some operation that will take enough time that the user will notice, you might want to consider not running it in the UI thread. Некоторые общие примеры: network IO и database accesses. Это что-то в каждом конкретном случае, так что вам нужно сделать вызов для себя немного.

Ответ 2

Хорошо, если построение списка объектов не является относительно коротким процессом, выполнение его в onCreate() будет блокировать/замедлять основной поток. Если вы используете отдельный поток, это позволит андроиду os загружать все элементы пользовательского интерфейса, пока вы ожидаете заполнения списка. Затем, когда список объектов готов, вы можете мгновенно заполнить уже инициализированный пользовательский интерфейс, в отличие от ожидания инициализации пользовательского интерфейса до тех пор, пока не будет создан список объектов. Это гарантирует, что ваше приложение всегда будет реагировать на пользователя.

Ответ 3

Потому что у вас всего 0,5 секунды для выполнения onCreate - после чего появляется сообщение об ошибке с ошибкой ADN (приложение не отвечает). Поэтому, если ваш список не будет супер простым, вы не сможете это сделать вовремя. И даже если ваш просмотр списка очень прост, лучше изучить его надлежащим образом.

BTW: Я даже не использую потоки, я использую одну или несколько Служб для выполнения всей работы. Еще сложнее реализовать, но более надежную и отзывчивую.

Ответ 4

Причина, по которой вы не делаете что-то в onCreate или в потоке пользовательского интерфейса, - это отзывчивость. Если ваше приложение занимает слишком много времени для обработки, пользователю будет показано диалоговое окно "Не реагировать на приложение".

Ответ 5

Мой учитель однажды сказал: каждое программное обеспечение может быть записано в одном (большом) цикле.

И если вы думаете: это может быть... возможно, на уровне NDK.

Некоторые разработчики SDK хотели облегчить задачу разработчиков программного обеспечения, и именно поэтому существует SDK и фреймворки.

Если вам не нужно ничего из многозадачности, вы должны использовать одиночную нить.

Иногда существуют ограничения по времени, иногда ограничения UI/фона/сети и необходимость делать вещи в потоках diff.

Ответ 6

Если вы видите исходный код Asyntask и Handler, вы увидите их код на Java. (конечно, есть некоторые исключения, но это не важный момент).

Почему это означает? Это означает отсутствие магии в Asyntask или Handler. Они просто упрощают вашу работу в качестве разработчика.

Например: если ProgramA вызывает методA(), методA() будет запускаться в другом потоке с помощью ProgramA. Вы можете легко протестировать:

Thread t = Thread.currentThread();
int id = t.getId();

И зачем вам использовать новый поток? Вы можете использовать Google. Много причин.

Итак, в чем разница?

AsyncTask и Handler написаны на Java (внутренне используют Thread), поэтому все, что вы можете сделать с Handler или AsyncTask, можно также использовать с помощью Thread.

Какой Handler и AsyncTask действительно помогут вам?

Наиболее очевидной причиной является связь между потоком вызывающего и рабочей нитью. (Caller Thread: поток, который вызывает рабочий поток для выполнения некоторой задачи. Caller Thread может не быть нитью пользовательского интерфейса). И, конечно же, вы можете общаться между двумя потоками другими способами, но есть много недостатков, например: Основной поток не является потокобезопасным (в большинстве случаев), другими словами, DANGEROUS.

Вот почему вы должны использовать Handler и AsyncTask. Они выполняют большую часть работы для вас, вам просто нужно знать, какие методы можно переопределить.

Обработчик различий и AsyncTask: используйте AsyncTask, когда поток вызывающего абонента является потоком пользовательского интерфейса. Это то, что говорится в документе Android:

AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers

Я хочу подчеркнуть два момента:

1) Простое использование потока пользовательского интерфейса (поэтому, когда поток вызывающего абонента является потоком пользовательского интерфейса).

2) Не нужно манипулировать обработчиками. (означает: вы можете использовать Handler вместо AsyncTask, но AsyncTask - это более простой вариант).

В этом посте еще много вещей, о которых я еще не сказал, например: что такое UI Thread, почему это проще. Вы должны знать какой-то метод за каждым видом и использовать его, вы полностью поймете, почему..

@: когда вы читаете документ Android, вы увидите:

Handler allows you to send and process Message and Runnable objects associated with a thread MessageQueue

Сначала они могут показаться странными. Просто поймите, что каждый поток имеет каждую очередь сообщений. (например, To To List), и поток будет принимать каждое сообщение и делать это до очереди сообщений emty. (Ах, может быть, как вы закончили свою работу и ложитесь спать). Таким образом, когда Handler обменивается данными, он просто передает сообщение вызывающему потоку, и он будет ждать обработки. (sophiscate?, но вы просто знаете, что Handler может взаимодействовать с потоком вызывающего абонента в безопасном режиме)