Последовательное выполнение операций, изменяющих пользовательский интерфейс

Фактическая работа делается в Asynctask, AsyncTask возвращает результаты. Пользователям требуется визуальная подсказка о том, что происходило за кулисами, что включает в себя несколько независимых модификаций пользовательского интерфейса, которые должны быть выполнены последовательно. Модификации пользовательского интерфейса включают анимацию, поэтому следующее задание в очереди должно ждать завершения текущей анимации. [последовательность не фиксирована, но меняется в зависимости от результата, полученного AsyncTask.]

Вся тяжелая работа, например доступ к сети, осуществляется AsyncTaskЯ ищу лучший способ последовательного изменения пользовательского интерфейса.

Мой текущий подход: в настоящее время я использую https://github.com/yigit/android-priority-jobqueue

Когда модификация пользовательского интерфейса завершается, он отправляет событие по шине событий и jobManager запускается [останавливается, когда job"s onRun называется].

В настоящее время я пишу на обработчик пользовательского интерфейса внутри onRun из Job, Это работает, но библиотека предназначена для записи на диски и выполнения длительных операций, а не операций пользовательского интерфейса. Есть ли лучший способ сделать это?

2 ответа

Поместите свою модификацию пользовательского интерфейса в метод onPostExecute вашего AsyncTask, он по умолчанию запускается в потоке пользовательского интерфейса, поэтому вы можете обновить его после завершения всей загрузки в doInBackground.

Если вы сразу хотите сделать это внутри doInBackground, используйте следующий метод внутри этого метода.

 runOnUiThread(new Runnable(){

  public void run(){

  //your ui updations here
  }

});

Установите прослушиватель анимации для каждой анимации и используйте onAnimationEnd для запуска следующей анимации здесь:

fadeInAnimation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {

}

@Override
public void onAnimationEnd(Animation animation) {
   //trigger next animation here to make it sequential
}

@Override
public void onAnimationRepeat(Animation animation) {

}
});

Это поможет пакетированию и поддержанию последовательности анимаций.

Я настоятельно рекомендую вам использовать RxJava!

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

Подсказка: вы также должны использовать Retrolambda, чтобы сделать RxJava вашим Кодексом чище.

Другие вопросы по тегам