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

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

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

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

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

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


person q126y    schedule 08.07.2016    source источник
comment
Уточните, пожалуйста, ваш вопрос: более элегантное решение - довольно сложная метрика, чтобы определить, подходит ли вам ответ или нет.   -  person Baschi    schedule 08.07.2016
comment
@Баски уточнил.   -  person q126y    schedule 08.07.2016


Ответы (2)


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

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

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

person dipdipdip    schedule 08.07.2016
comment
Message queues. Queues like in MSMQ or a JMS implementation generally have transactionality and are by definition sequential. и RxJava не рекомендуется для этого варианта использования с: introtorx.com /Content/v1.0.10621.0/01_WhyRx.html#WhyRx И как мы реализуем очередь заданий в RxJava? - person q126y; 08.07.2016
comment
Я не думаю, что вы можете сравнить это утверждение со своей проблемой. Двумя преимуществами RxJava являются упрощение сложных потоков и (специфический для Android) простой способ перехода между различными потоками: Worker и Main Thread в вашем случае. Я предполагаю, что немного сложнее реализовать очередь заданий с заданной информацией, но это определенно должно быть возможно с RxJava. - person dipdipdip; 08.07.2016
comment
И упомянутый мной сайт говорит не использовать RxJava для очередей заданий. - person q126y; 08.07.2016

поместите свою модификацию пользовательского интерфейса в метод 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) {

}
});

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

person Kushan    schedule 08.07.2016
comment
Мне нужны пакетные операции пользовательского интерфейса. Для завершения новых операций пользовательского интерфейса требуется предыдущая анимация. чего в данном случае не будет. - person q126y; 08.07.2016
comment
затем, во-вторых, @dipdipdip, используйте Rxjava с RetroLambda. прочитайте об этом, чтобы получить четкое представление, это довольно сложно объяснить здесь. - person Kushan; 08.07.2016
comment
Message queues. Queues like in MSMQ or a JMS implementation generally have transactionality and are by definition sequential. и RxJava не рекомендуется для этого варианта использования из: introtorx.com/Content/v1.0.10621.0/01_WhyRx.html#WhyRx. Также не могли бы вы дать несколько советов о том, как реализовать очередь заданий в RxJava? - person q126y; 08.07.2016
comment
используйте setAnimationListener для каждой анимации. Он предоставляет метод onAnimationEnd. здесь вы можете запустить следующую анимацию - person Kushan; 08.07.2016
comment
В настоящее время я использую только этот подход. Вы знаете, как реализовать очередь заданий в rxjava? - person q126y; 08.07.2016
comment
не использовал это так, извините :( Я просто использую его, чтобы прыгать и обрабатывать потоки. - person Kushan; 08.07.2016