2016-05-14 8 views
2

私のコードは何ですか:私のアクティビティには、ユーザがボタンを押したときに開始するCountDownTimerがあります。完了すると、サウンドが再生されます。ここでは、コードです:CountDownTimerの内部で定期的にメソッドを呼び出すにはどうすればよいですか?

public class PrepTimer extends CountDownTimer { 
    public PrepTimer(long millisInFuture, long countDownInterval) { 
     super(millisInFuture, countDownInterval); 
    } 

    @Override 
    public void onTick(long millisUntilFinished) { 
     updateSessionRemaining(millisUntilFinished); 
     setPrepDigits(millisUntilFinished); 
    } 

    @Override 
    public void onFinish() { 
     session.setPrepRemaining(0); 
     playSound(); 
    } 
} 

私はそれが何をしたいのですがどのような:私は音が(末尾に加えて)、タイマーの経過とともに、定期的にプレーしたいと思います。たとえば、10分のタイマーでは、音が60秒ごとに再生されることがあります。私が試した

もの:

  • millisUntilFinishedが一定値(例えば60秒の倍数)に等しいときにチェックするためにonTickメソッド内ifステートメントを使用して、実行しています方法。これは最も単純な解決策のようですが、メソッドが一貫して起動されていないことがわかりました(恐らくmillisUntilFinishedは私がそれをチェックしている値をスキップしていますか?)。
  • 別のネストされたCountDownTimersを作成し、ループでforループを繰り返す。これの問題は、コードがすぐに過度に複雑になり、私の直感からタイマー内でタイマーを実行すべきではないということです。

質問: CountDownTimerの過程で定期的にメソッドを実行するにはどうすればよいですか?代わりに、あなたは、単にポストを使用することができますカウントダウンタイマーを使用しての

+1

最初のアプローチを使用してもう少し寛容にしてください。 60秒以内にテストしないでください。現在の60秒の間隔で再生されたサウンドかどうかをテストします。 – tynn

+0

いいアイデア@tynn。私はあなたがサウンドを再生したいと思う 'tick間隔 'を持つ別のタイマーを作ろうと考えていました。また、' onFinish'もサウンドを再生することができます。私はこれが実行可能な解決策だと思います。 – Vucko

答えて

0

以下のように指定された時間間隔でハンドラを投稿します私はシンプルさの主な要件を満たす解決策を思いつきました。ここではそれを採用する方法は次のとおりです。CountDownTimer

private void runOnInterval(long millisUntilFinished) { 
    if (millisUntilFinished < startTime) { 
     playSound(); 
     startTime -= interval; 
    } 
} 

内側の間隔で実行するようにメソッドを宣言し呼び出す

private long startTime = 60000; // Set this equal to the length of the CountDownTimer 
private long interval = 10000; // This will make the method run every 10 seconds 

宣言2クラスレベルの変数方法のonTickの方法CountDownTimer

パスmillisUntilFinishedonTick方法にそれがダニたびに:
// ... 
@Override 
    public void onTick(long millisUntilFinished) { 
     runOnInterval(millisUntilFinished); 
    } 
// ... 

そして、ここではそれがどのように動作するかです。次にrunOnInterval()は、その値がstartTimeより小さいかどうかを確認します。そうであれば、ifステートメント(私の場合はplaySound())内のコードを実行してからstartTimeをデクリメントしてintervalという値にします。 millisUntilFinishedがもう一度startTimeよりも低いと、プロセスが再び開始されます。

上記のコードは、別のCountDownTimerまたはHandlerRunnableを使用するのが簡単です。 CountDownTimerの一時停止とリセットを処理するためにアクティビティに追加した可能性のある機能を自動的に使用します。

0

はハンドラを遅延し、メソッドの最後thread.Atのために、この上で考えた後、コード

Runnable myThread = new Runnable() { 
    @Override 
    public void run() { 
     //call the method here 
     myHandler.postDelayed(myThread, 1000);//calls thread after 60 seconds 
    } 
}; 
myHandler.post(myThread);//calls the thread for the first time 
+0

私はこれを試してみます。ハンドラを一時停止(または少なくとも破棄)できますか?ユーザーが完了する前にタイマーをキャンセルする機能を含める必要があります。 –

+0

CountDownTimersのように、遅れているハンドラーを取り消して再作成する必要があると思われます。ありがとう。 –

+0

はい、ブール変数を設定し、それをクリックして設定し、postDelayedを呼び出す前に条件をチェックすることができます。 –

関連する問題