Android сразу запускается в пользовательском интерфейсе - PullRequest
0 голосов
/ 06 декабря 2018

Я прочитал много других ответов о StackOverflow, кажется, не могу найти мой ответ.

У меня есть слушатель в моем классе, я выполняю долгосрочную задачу в асинхронном блоке:

AsyncTask.execute(() -> {
   // long running task here
   // ...
   listener.updateTitle(newTitle);
});

Как только у меня есть данные, я передаю их обратно в соответствующий класс:

 @Override
 public void updateTitle(String newTitle) {
   getActivity().runOnUiThread(() -> title.setText(newTitle));
 }

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

Возможно ли добавить эту задачу в начало очереди или выполнить текущую задачу, а затем выполнить эту новую задачу?и продолжить выполнение задач, как они были в предыдущем порядке?

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Несколько вещей:

  1. Если ваш поток пользовательского интерфейса занят, что вам нужно подождать обновления заголовка, вам нужно подумать, что ваш дизайн приложения не нашел способаопередить Q.

  2. Из AsynTask, чтобы получить что-то для запуска в потоке пользовательского интерфейса, используйте publishProgress

НТН

0 голосов
/ 07 декабря 2018

Конечно:

new Handler(Looper.getMainLooper()).postAtFrontOfQueue(() -> title.setText(newTitle));

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...