Android: последовательность выполнения runOnUiThread()

#android #multithreading #java-native-interface #handler #runnable

#Android #многопоточность #java-родной интерфейс #обработчик #выполняемая

Вопрос:

У меня есть два встроенных метода JNI, которые вызывают методы Java в моем пользовательском интерфейсе.

1) Отображение прогресса .. 2) Отклонение прогресса

Оба вышеуказанных вызова определенно выполняются последовательно. Они оба вызывают методы Java, которые создают новые исполняемые файлы следующим образом:

 m_Activity.runOnUiThread( new Runnable()
{
  @Override
  public void run()
  {
    DisplayProgressUpdate( m_ProgressPercent );
  }
} );
  

 m_Activity.runOnUiThread( new Runnable()
{
  @Override
  public void run()
  {
    m_Progress.dismiss();
  }
} );
  

Что я вижу, так это то, что запускаемый запуск выполняется до завершения выполнения обновления. Я бы подумал, что, поскольку они вызывались последовательно и поскольку они оба запрашиваются в одном и том же потоке (UI), они также будут выполняться последовательно. Разве это не так?

Поэтому я должен использовать что-то вроде обработчика для синхронизации / упорядочивания этих вызовов?

РЕДАКТИРОВАТЬ: Хорошо, я внедрил обработчик и все еще наблюдал то же поведение. На самом деле меня смутила моя отладка. Казалось, что отклонение кода Java происходило до завершения обновления прогресса, но на самом деле это была отладочная печать Java, как только JNI вызывал метод Java, который выполнял отправку в обработчик, а не сам фактический выполняемый поток. Так что .. tajonn07 был прав в некотором смысле -диалоговое окно закрывалось до того, как я успел его увидеть, и моя отладка сбила меня с толку. Спасибо за помощь, ребята.

Комментарии:

1. Разве нет гарантии, что процессы, запущенные в одном потоке, будут выполняться последовательно?

Ответ №1:

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

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

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

Комментарии:

1. Вы правы — я не вижу диалогового окна — все в порядке. Проблема, которую я пытаюсь решить, касается того, что происходит потом. Я поворачиваю свое устройство, а затем снова появляется диалоговое окно выполнения — и это зависит от установленного мной флага «показать запрошенный». Это и вывод LogCat, который я вижу, предполагают, что обновление прогресса не завершено до вызова dismiss . Я думаю, что b.j.g имеет смысл.

Ответ №2:

runOnUiThread не добавляется в очередь в Android, он вызывается сразу при его вызове. Если вам нужна очередь / последовательность (т.Е. Одна за другой), вы должны использовать обработчик.

Комментарии:

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