2017-01-13 6 views
7

Я начинаю разработку приложений для Android. Я работаю с потоками в android.I читал о runOnUiThread, которые запускают код на основном пользовательском интерфейсе (если я не ошибаюсь? .).Разница между android runOnUiThread и простой код в java

Мой вопрос в чем разница между нормальным кодом на основном пользовательском интерфейсе и кодом внутри runOnIUThread.

Пример: 1

class A 
{ 
getDataFromServer(foo);//Code on mainUI 
} 

Пример: 2

getActivity.runOnUiThread(new Runnable(){ 
@Override 
public void run(){ 
getDataFromServer(foo); 
} 
}); 

Какова разница в обоих example.Please помощь ответ me.Your будет новое обучение для меня.

+1

Если вы хотите обновить пользовательский интерфейс в потоке, отличном от UI, тогда используется 'runOnUiTread()'. –

+0

Если вы не хотите использовать runOnUiThread(), то используйте AsyncTask, у него есть preExecute и postExecute для взаимодействия с пользовательским интерфейсом. –

+0

Что делать, если я обновляю форму пользовательского интерфейса runOnUiThread может кодировать внутри потока, идет к длительному процессу, будет ли он блокировать дальнейшее выполнение (ANR) –

ответ

12

Предполагая, что вы имели в виду простой код для UIThread кода,

Что нить?

Поток определяет процесс, протекающий

Первый runOnUiThread ..

Запускает указанное действие на нити UI. Если текущий поток равен нити пользовательского интерфейса, то действие выполняется немедленно. Если текущий поток равен не поток пользовательского интерфейса, действие отправляется в очередь событий из пользовательского интерфейса.

Что UIThread

  • Основной поток исполнения для вашего приложения
  • Большинство кода приложения будет работать здесь onCreate, , onDestroy, onClick и т.д.

    Так просто Все, что заставляет пользовательский интерфейс обновляться или изменяться, должно произойти в потоке пользовательского интерфейса

Когда вы явно породит новую нить, чтобы сделать работу в фоне, этот код не работает на UIThread.Now что, если вы хотите сделать что-то, что изменяет UI? Затем вы можете: runOnUiThread

Вы должны использовать runOnUiThread(), если вы хотите обновить свой пользовательский интерфейс от темы, отличной от UI. Например, если вы хотите обновить свой пользовательский интерфейс из фонового потока. Вы также можете использовать Handler для того же самого.

+0

Может ли runOnUiThread блокировать дальнейшую эксклюзию, другими словами, может ли он создать ANR, если поток переходит к длительному процессу? –

+0

Ну, это зависит. с вашей задачей. Если есть какой-то процесс, который вы должны использовать обработчик https://developer.android.com/guide/components/processes-and-threads.html#WorkerThreads t, эти фоновые потоки способность выполнять код, который может изменять пользовательский интерфейс. Они делают это, помещая UI-модифицирующий код в объект Runnable и передавая его методу runOnUiThread. –

+0

Activity.runOnUiThread() - это особый случай более общих обработчиков. С помощью Handler вы можете создать свой собственный запрос событий в своем потоке. Использование обработчиков, созданных с помощью конструктора по умолчанию, не означает, что «код будет работать в потоке пользовательского интерфейса» вообще. По умолчанию обработчики привязаны к Thread, из которого они были созданы. Поэтому, если вы подозреваете, что какой-то ANR использует обработчик –

2

Обычно ваш код выполняется в потоке пользовательского интерфейса. Для более длительных задач (например, сетевых запросов и т. Д.) Вы будете использовать фоновые задачи (Handler, AsyncTask, Thread, ...).

Как ваши представления могут быть только прикоснулся из потока пользовательского интерфейса, вы используете runOnUiThread() если вы выполняете код в фоновом потоке, и вам необходимо обновить свои взгляды, от этого фонового потока.

+0

Это означает, что runOnUiThread запускает код в фоновом режиме? Может ли он создать ANR? –

+0

Нет, вы вызываете 'runOnUiThread' ** из ** вашего обратного потока для выполнения кода на вашем основном потоке –

+0

Что делать, если я буду использовать это .... new Thread (new Runnable() { (At) Override public недействительным запуска() { runOnUiThread (новый Runnable() { (В) Перекрыть общественный пробег недействительным() {// код здесь } });} . }) начать(); –

1

Чтобы объяснить «почему» у Android есть опция «runOnUiThread()», важно понять, что Java используется только для создания байт-кода (dex), который использует Android. Код, запущенный на телефоне, не является java.

Кроме того, в Android-аннотациях 'can' есть вещь, называемая "петлером". Этот «looper» - это то, что обрабатывает «задачи (технически запущенные и сообщения)» в порядке очереди. «Основной поток ui» по умолчанию уже прикреплен к нему.

Это означает, что созданный вами runnable был помещен в очередь петлителя основного потока пользовательского интерфейса. (вот почему runnable НЕ выполняется мгновенно, но будет запущен «быстро»/«скоро»)

Причина, по которой вы используете runnable для запуска кода в потоке пользовательского интерфейса, - это потому, что вы находитесь в каком-то другом ' фоновый поток ", который вы создали ... и хотите каким-то образом обновить интерфейс. (Только поток пользовательского интерфейса может взаимодействовать с UI)