web-dev-qa-db-ja.com

handler.postdelayedプロセスをキャンセルする

handler.postDelayed()を使用して、アプリの次のステージが実行されるまでの待機期間を作成しています。待機期間中、進行状況バーとキャンセルボタンを含むダイアログを表示しています。

私の問題は、時間が経過する前にpostDelayedをキャンセルするタスクを見つける方法が見つからないことです。

234
Ron

私はこれを実行して遅延実行可能ファイルを投稿します:

myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH); 

そして、これを削除するには:myHandler.removeCallbacks(myRunnable);

447
Varun

複数の内部/匿名の実行可能ファイルが同じハンドラーに渡されており、同じイベントの使用ですべてをキャンセルしたい場合

handler.removeCallbacksAndMessages(null);

ドキュメントごとに、

Objがトークンであるコールバックおよび送信済みメッセージの保留中の投稿を削除します。トークンがnullの場合、すべてのコールバックとメッセージが削除されます。

41
Mani

別の方法は、Runnable自体を処理することです。

Runnable r = new Runnable {
    public void run() {
        if (booleanCancelMember != false) {
            //do what you need
        }
    }
}
17
codeScriber

ポスト内でCancelCallBacks(this)を呼び出すと、booleanを介してrunnableが遅延して動作しました

Runnable runnable = new Runnable(){
    @Override
    public void run() {
        Log.e("HANDLER", "run: Outside Runnable");
        if (IsRecording) {
            Log.e("HANDLER", "run: Runnable");
            handler.postDelayed(this, 2000);
        }else{
            handler.removeCallbacks(this);
        }
    }
};
0

遅延アクションのキャンセルメソッドを提供するクラスを次に示します

public class DelayedAction {

private Handler _handler;
private Runnable _runnable;

/**
 * Constructor
 * @param runnable The runnable
 * @param delay The delay (in milli sec) to wait before running the runnable
 */
public DelayedAction(Runnable runnable, long delay) {
    _handler = new Handler(Looper.getMainLooper());
    _runnable = runnable;
    _handler.postDelayed(_runnable, delay);
}

/**
 * Cancel a runnable
 */
public void cancel() {
    if ( _handler == null || _runnable == null ) {
        return;
    }
    _handler.removeCallbacks(_runnable);
}}
0