以下は、私がカスタム用に持っているいくつかのコードの簡略化です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
それなら二度呼ばれるので、私はそうしないことを望みます。この場合、どうすればこの問題を解決できますか?