2013-03-15 33 views
14

私は、AndroidアプリケーションにTextViewの色を点滅させるアニメーションを持っています。私はこれを実装するためにTimerTask、Timer、およびRunnableメソッドを使用しました。私がする必要があるのは、onPause()でこのアニメーション中にユーザーがアプリケーションを離れるときにスレッドを停止し、onResume()でユーザーがアプリケーションに戻るときにスレッドを再開することです。以下は私が実装したコードですが、動作しません(onPause()、onResume())。なぜか分かりません。私は同様の問題についていくつかの他の記事を読んだことがありますが、私の状況で何をすべきかを理解する助けにはなりませんでした。私はTimerTasksが古くなっていることを読んだので、おそらくExecutorServiceメソッドを使うべきです。この機能を実装する方法として私には不明です。 TimerTaskがキャンセルされた後TimerTask/Timerを一時停止、再開する方法

...timerStep5 = new TimerTask() { 

     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
       if (b5) { 
        cashButton2SignalText.setBackgroundColor(Color.RED); 
        cashButton2SignalText.setTextColor(Color.WHITE); 
        b5=false; 
       } else { 
        cashButton2SignalText.setBackgroundColor(Color.WHITE); 
        cashButton2SignalText.setTextColor(Color.RED); 
        b5=true; 
       } 
       } 
      }); 
     } 
}; 

timer5.schedule(timerStep5,250,250); 

} 

public void onPause(){ 

    super.onPause(); 

    timerStep5.cancel(); 

} 

public void onResume(){ 

    super.onResume(); 

    timerStep5.run(); 

} 
+0

の可能性のある重複した[一時停止/停止、継続的にJavaのTimerTaskを再開/開始に?](http://stackoverflow.com/questions/2098642/pausing-stopping-and-starting-resuming-java-timertask-continuously ) – Gboy

答えて

12

は、それはあなたが新しいインスタンスを作成する必要があり、再実行することはできません。ここ

読むの詳細は:

https://stackoverflow.com/a/2098678/727768

ScheduledThreadPoolExecutorは、新しいコードのために推奨され、それがスケジュールされた間隔よりも長い時間を割い例外とタスクのようなケースを処理します。

あなたの仕事では、TimerTaskで十分です。

+0

私はこの投稿を以前に見て、それと混同しました。多分あなたは私のために何かを明確にすることができます:ユーザは、TimerTaskアクティビティ中に私のアプリケーションを離れ、そのアクティビティに複数回戻ることがあります。つまり、ユーザーがこのアクティビティ中に離れるたびに、onResume()内にTimerTaskの新しいインスタンスを作成しなければならないということではないでしょうか? – embersofadyingfire

+0

質問:このアクティビティをいったん終了して戻ったユーザーの操作を無視し、TimerTaskの一時停止と再開の実装を取り除き、ユーザーが最後に進むときにonStop()を実装してTimerTaskをキャンセルするとします。 TimerTaskアクティビティが一時停止されている間、何らかの種類のメモリリークが発生するでしょうか? – embersofadyingfire

+1

私はメモリリークがあるとは思わないが、あなたのUI更新タスクをバックグラウンドで何も実行させないようにするのは意味がありません。はい、あなたはその場でTimerTaskを作成するはずです。再利用できません。このように設計されています。 (私はスレッドの安全性を推測します)また、onResumeはタイトなループではなく、オブジェクトを作成するコストは無視できます。 –

2

ここで私はそれをしました。 pauseTimer booleanを追加すると一時停止が発生します(おそらくボタンリスナー)、trueの場合はタイマーをカウントしません。

private void timer(){ 
    Timer timer = new Timer(); 
    tv_timer = (TextView) findViewById(R.id.tv_locationTimer); 
    countTimer = 0; 
    timer.scheduleAtFixedRate(new TimerTask() { 
     @Override 
     public void run() { 
      runOnUiThread(new Runnable() { 
       @Override 
       public void run() { 
        String s_time = String.format("%02d:%02d:%02d", 
          countTimer/3600, 
          (countTimer % 3600)/60, 
          countTimer % 60); 
        tv_timer.setText(s_time); 
        if (!pauseTimer) countTimer++; 
       } 
      }); 
     } 
    }, 1000, 1000); 
} 
関連する問題