基本的に、ユーザーがゲームに勝ったとき、元のスコアから新しいスコアまでアニメーション化 (カウントアップ) したい。
以下に示すように、タイマーを使用してこれを実行しようとしています
public final void updatePlayerScore(final int newScore){
final Timer t = new Timer();
TimerTask tt = new TimerTask() {
@Override
public void run() {
mHandler.post(new Runnable() {
public void run() {
initialScore++;
// update TextView
scoresTextView.setText("" + initialScore);
if(initialScore >= newScore){
t.cancel();
mHandler2.postDelayed(mLaunchNextQuestion,1000);
}
}
});
}
};
t.scheduleAtFixedRate(tt, 0, 2);
初期スコアは、initialScore が newScore と等しいかそれより大きい場合、TimerTask が呼び出されるたびに (2 ミリ秒ごとに) 増加します。タイマーをキャンセルしてから、新しいアクティビティ mLaunchNextQuestion をロードする必要があります。
実際に起こっていることは、mLaunchNextQuestion が複数回呼び出されていることです。これは、timer.cancel が機能していないか、タイマーが高速で実行されてキャンセルされたためだと思いますか?
アップデート - -
リフレッシュレートが速すぎるというアドバイスをありがとう。私はタイマーを捨ててしまい、代わりに遅延後に自分自身を呼び出すランナブルを使用しました。
private Runnable updatePlayerScoreNew(final int newScore){
Runnable aRunnable = new Runnable(){
public void run(){
if (initialScore >= newScore) {
mHandler.postDelayed(mLaunchNextQuestion,1000);
} else {
initialScore+=40;
if(initialScore > newScore){
scoresTextView.setText("" + newScore);
}else{
scoresTextView.setText("" + initialScore);
}
mHandler.postDelayed(updatePlayerScoreNew(newScore), 40);
}
}
};
return aRunnable;
}