【问题标题】:Sequential exeution of operations that modify UI修改 UI 的操作的顺序执行
【发布时间】:2016-11-11 02:04:11
【问题描述】:

实际工作正在Asynctask 中完成,AsyncTask 返回结果。用户需要视觉提示来了解幕后发生的事情,这涉及到按顺序完成多个独立的 UI 修改。 UI 修改涉及动画,因此队列中的下一个作业必须等待当前作业的动画完成。 [顺序不固定,根据AsyncTask收到的结果不同。]

网络访问等所有繁重的工作都由AsyncTask 完成,我正在寻找一种更好的方法来按顺序修改 UI。

我目前的方法: 目前我正在使用https://github.com/yigit/android-priority-jobqueue

当 UI 修改完成时,它会在 eventbus 上发送事件,并启动 jobManager[在调用 jobonRun 时停止]。

我目前在JobonRun 内发布 UI 处理程序。 它可以工作,但该库是为写入磁盘和长时间运行的操作而不是 UI 操作而设计的。有没有更好的方法?

【问题讨论】:

  • 请澄清您的问题:更优雅的解决方案是确定答案是否适合您的一个相当困难的指标。
  • @Baschi 澄清。

标签: android android-asynctask ui-thread android-priority-jobqueue


【解决方案1】:

我强烈推荐你使用RxJava

  • 您将摆脱 AsyncTask
  • 您的 Logik 似乎有点困难,您想在不同的线程之间跳转。 RxJava 将为您提供很多帮助。

提示:您还应该使用Retrolambda 使 RxJava 成为您的代码更清洁。

【讨论】:

  • 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 中实现作业队列?
  • 我认为您无法将此陈述与您的问题进行比较。 RxJava 的两个优点是简化复杂流程和(特定于android)在不同线程之间跳转的简单方法:在您的情况下是工作线程和主线程。我想用给定的信息来实现一个作业队列有点复杂,但是用 RxJava 肯定是可能的。
  • 我提到的网站说不要将 RxJava 用于作业队列。
【解决方案2】:

将您的 UI 修改放在 AsyncTask 的 onPostExecute 方法中,它默认在 UI 线程上运行,因此您可以在 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) {

}
});

这将有助于批处理和维护动画序列

【讨论】:

  • 我需要批量 UI 操作。新的 UI 操作需要以前的动画才能完成。在这种情况下不会发生。
  • 然后我第二个@dipdipdip,使用带有RetroLambda 的Rxjava。阅读它以获得清晰的图片,在这里解释起来非常复杂。
  • 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 中实现作业队列的指针?
  • 在每个动画上使用 setAnimationListener。它提供了一个 onAnimationEnd 方法。在这里你可以触发你的下一个动画
  • 我目前只使用这种方法。你知道在rxjava中如何实现job queue吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 2018-12-28
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多