2012-03-09 7 views
1

スケジューラを使用して、自分のループに時間がかかりすぎないようにするため、スケジューラが起動してループを終了するとループを終了します。ScheduledExecutorServiceを使用してAndroidでスケジュールされたタスクをスケジュール解除する

これは前方にかなりストレートです:

public void startSchedulerForTimeout() { 

    Log.i("x", "SCHEDULING TIMEOUT "); 
    timeoutForLoopReached = false; 
    scheduler.schedule(new Runnable() { 
    public void run() { 
     timeoutForLoopReached = true; 
     Log.i("x", "SET TIMEOUT FLAG "); 
     } 
    }, 10, TimeUnit.SECONDS); 
} 

ので、私のコードで私は書く:

startSchedulerForUSBMessageTimeout(); 
while (!done && !timeoutForLoopReached) { 
    ...do the loop stuff 
} 

私は私が必要とするループを再度実行すると、スケジュールされたタスクが発生しませんことを確認するために新しいループの開始時に新しいタイマーが再び開始されるように、古いタスクのスケジュールを解除する(タイムアウトの前にループを終了した場合)。最初のループが2回目の間に終了した後にループが実行されます)

このスケジュールされたタスクミックスアップを回避するために起動されていないスケジュールされたタスクのスケジュールを解除するにはどうすればよいですか?

多くの感謝!

答えて

5

使用ScheduledFuture

ScheduledExecutorService scheduledTaskExecutor = Executors.newScheduledThreadPool(1); 
Runnable longRunningTask = new Runnable(); 

// schedule long running task in 2 minutes: 
ScheduledFuture scheduleFuture = scheduledTaskExecutor.schedule(longRunningTask, 2, TimeUnit.MINUTES); 

... ... 
// At some point in the future, if you want to cancel scheduled task: 
scheduleFuture.cancel(true); 
... ... 
+0

超 - ありがとう。ところで、これがすべて1つの方法にあり、完全な方法が1分後に終了した場合。メソッドが完了してからスケジュールタスクがまだ存在するのですか、それとも自動的に強制終了されますか?また、同じscheduleFutureを2回以上キャンセルすると、問題が発生しますか?またはすでに取り消されている(または実行されている)かどうかを確認する必要がありますか? – user387184

+0

ところで、私はちょうどアプリを終了し、デバッガは印刷を続け、デバッガ出力のバックログのようには見えません。だから、アプリが終了するまで「戻る」を押してもアプリは稼動し続けますか?奇妙ではないですか? – user387184

+0

@ user387184 1.スケジュールされたタスクは自動的に強制終了されません。 ScheduledExecutorService.shutdownNow()を使用して、実行中および待機中のすべてのタスクを終了します。 2. cancel()メソッドのAPIをチェックアウトします。_Attempts 3.このタスクの実行をキャンセルします。タスクが既に完了している、すでにキャンセルされている、または他の理由でキャンセルできなかった場合、この試行は失敗します._ 3. APIをチェックアウトすると、ScheduledFutureクラスのgetDelay()、isCancelled() )など – yorkw

1

scheduleのすべての優先度は、であり、Futureであり、cancelメソッドを返します。

+0

あなたは小さなコードスニペットを提供してくださいだろうか? – user387184

関連する問題