Последовательное выполнение операций, изменяющих пользовательский интерфейс
Фактическая работа делается в 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 вашим Кодексом чище.