@Yuriがここから投稿したコードを参照してください。 特定の回数の後にタイマーを停止する方法 。なんらかの理由でそれを停止してから、再起動したい場合。どうすればそれができますか?
private final static int DELAY = 10000;
private final Handler handler = new Handler();
private final Timer timer = new Timer();
private final TimerTask task = new TimerTask() {
private int counter = 0;
public void run() {
handler.post(new Runnable() {
public void run() {
Toast.makeText(MainActivity.this, "test", Toast.LENGTH_SHORT).show();
}
});
if(++counter == 4) {
timer.cancel();
}
//do some stuff in my app
//restart the timer again
}
};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timer.schedule(task, DELAY, DELAY);
}
これが私が試したものですが、何度もクラッシュします。
final int DELAY = 10000;
Timer timer;
MyTask task;
startManager Scanner;
Handler handler;
public class MyTask extends TimerTask {
@Override
public void run() {
handler.post(new Runnable() {
public void run() {
//do Stuff here
}
});
}
public class startManager {
public startManager() {
handler = new Handler();
timer = new Timer();
}
public void start() {
timer.schedule(task, 0, DELAY);
}
public void cancel() {
timer.cancel();
timer.purge();
}
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Scanner = new startManager();
//do some stuff
if (...)
Scanner.cancel()
//restart the timer and its task
Scanner=new startManager();
}
すでに1つのタイマーをキャンセルしている場合、それを再開することはできません。新しいタイマーを作成する必要があります。
これを見てください answer 、ビデオとソースコードが含まれていて、私が同様のことをどのように行ったかを示しています。
基本的に2つの方法があります:一時停止と再開
一時停止中:
public void pause() {
this.timer.cancel();
}
再開:
public void resume() {
this.timer = new Timer();
this.timer.schedule( aTask, 0, 1000 );
}
これにより、一時停止/再開が認識されます。
タイマーがアプリケーションの状態に基づいて異なるアクションを実行する場合、 StatePattern の使用を検討できます。
拳は抽象的な状態を定義します:
abstract class TaskState {
public void run();
public TaskState next();
}
そして、好きなだけ州を提供してください。重要なのは、ある状態から別の状態に導くことです。
class InitialState extends TaskState {
public void run() {
System.out.println( "starting...");
}
public TaskState next() {
return new FinalState();
}
}
class FinalState extends TaskState {
public void run() {
System.out.println("Finishing...");
}
public TaskState next(){
return new InitialState();
}
}
そして、タイマーの状態を変更します。
Timer timer = new Timer();
TaskState state = new InitialState();
timer.schedule( new TimerTask() {
public void run() {
this.state.run();
if( shouldChangeState() ) {
this.state = this.state.next();
}
}
}, 0, 1000 );
最後に、同じことを実行する必要があるが速度が異なる場合は、 TimingFramework の使用を検討してください。もう少し複雑ですが、特定のコンポーネントの描画を(線形ではなく)異なるレートで実行できるようにすることで、クールなアニメーションを作成しましょう。
私がstartManager()でタスクを初期化しなかったことが原因です
これを行う方法はないようです: http://docs.Oracle.com/javaee/6/api/javax/ejb/Timer.html
タイマーをキャンセルしてから、新しいタイマーを作成できます。