【发布时间】:2016-05-14 18:58:21
【问题描述】:
我有一个控制器类,它需要对列表中的每个项目执行各种异步操作:
- 对于每个 A
- 播放音频并等待完成
- 等待 t 秒
- 对于 A 的每个子部分 B:
- 播放音频并等待
- 等待 t2 秒
当我的OnCompletionListener.onCompletion 方法被触发时,我知道音频已完成,当我的CountDownTimer.onFinish() 方法被触发时,我知道计时器何时完成。我试过返回听众:
for (final A a : getAs()) {
show(a);
playAudio(a.audioBegin, new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
wait(a.secs, new OnFinishListener() {
@Override
public void onFinish() {
if (a.hasSubparts) {
for (final B b : a.getBs()) {
playAudio(b.audioBegin, new MediaPlayer.OnCompletionListener() {
...
}
}
}
}
但最后我无法摆脱内部循环,这让我觉得整个想法都行不通。我查看了Future 界面,但这似乎也不是我想要的。
我知道我可以用一堆变量来解决这个问题,以跟踪我在状态流中的位置,但是带有一些框架的循环会更清晰。谢谢:)
【问题讨论】:
-
您可以尝试让控制器类实现这两个接口,然后在调用 onFinish() 后使用 Iterator#next() 在下一个 A 上调用 playAudio()。
-
@fractalwrench 谢谢,但这仍然让我不知道我目前在嵌套循环中的哪个位置。我编辑了我的问题以增加一些复杂性,即在每个子部分中播放更多音频。所以你是对的,我可以轻松实现接口,但是没有一个 Iterator#next() 可以调用。
-
不是一个真正的解决方案,但我最终创建了一个小型状态机并将状态保存在变量中。不是最干净的解决方案,所以如果有人可以提出替代方案,那就太好了。
标签: java android concurrency