Ниже приведено упрощение кода, который я имею для пользовательского View
. Он имеет Runnable
для анимации и Runnable
для аудио. Функция start()
запускает как анимацию, так и звукозапись. Каждый выполняемый реализует интерфейс с обратным вызовом по завершении.
Мне нужно знать, когда оба будут закончены, чтобы я мог позвонить onBothRunnablesFinished()
.
public class Foo extends View {
RunnableA mRunnableA;
RunnableB mRunnableB;
// overrides of onCreate, onMeasure, onDraw, etc...
private void onBothRunnablesFinished() {
// Do stuff when both runnables are finished...
}
public void start() {
mRunnableA = new RunnableA();
mRunnableB = new RunnableB();
post(mRunnableA);
post(mRunnableB);
}
private class RunnableA implements Runnable, AnimationListener {
private MyAnimation mAnim;
private boolean mRunning = false;
public RunnableA() {
mAnim = new MyAnimation();
mAnim.setAnimationListener(this);
}
public boolean isRunning() {
return mRunning;
}
@Override
public void run() {
mRunning = true;
startAnimation(mAnim);
}
// Called when mAnim finishes
@Override
public void onAnimationEnd(Animation animation) {
mRunning = false;
// **WHAT IF THE OTHER RUNNABLE FINISHES NOW?**
if (mRunnableB.isRunning() == false) {
onBothRunnablesFinished();
}
}
}
private class RunnableB implements Runnable, OnCompletionListener {
private MyMediaPlayer mMediaPlayer;
private boolean mRunning = false;
public RunnableB() {
mMediaPlayer = MyMediaPlayer();
mMediaPlayer.setOnCompletionListener(this);
}
public boolean isRunning() {
return mRunning;
}
@Override
public void run() {
mRunning = true;
mMediaPlayer.start();
}
// Called when mMediaPlayer finishes
@Override
public void onCompletion(MediaPlayer mp) {
mRunning == false;
// **WHAT IF THE OTHER RUNNABLE FINISHES NOW?**
if (mRunnableA.isRunning() == false) {
onBothRunnablesFinished();
}
}
}
}
Я обозначил несколько областей интереса комментариями. Что произойдет, если аудио и анимация запускаются одновременно? Точнее, может ли обратный вызов одного работающего объекта прервать обратный вызов другого в указанных выше местах с комментариями? Это возможно ??
Надеюсь, что нет, потому что тогда onBothRunnablesFinished
будет вызван дважды. Если это так, как я могу решить эту проблему?