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


259

handler.postDelayed()アプリの次のステージが行われる前に待機期間を作成するために使用しています。待機期間中に、プログレスバーとキャンセルボタンのあるダイアログを表示しています。

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



この要旨ヘルプgist.github.com/imammubin/a587192982ff8db221da14d094df6fb4 MainActivity as Screen Launcher with handler&runable function、Runnable run to login page or feed page with base preference login user with firebase。
ムビン

回答:


479

私はこれを遅延ランナブルを投稿するために行います:

myHandler.postDelayed(myRunnable, SPLASH_DISPLAY_LENGTH); 

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


74
ハンドラー上のすべてのコールバックとメッセージをキャンセルする余裕があり、実行可能ファイルへの参照を保持したくない場合は、この質問に対する受け入れられた回答の3番目のポイントが、とにかく私のケースで機能するように見える別の代替手段です:stackoverflow。 com / questions / 11299440 /… (本質的にmyHandler.removeCallbacksAndMessages(null);を呼び出す)
Mick

removeCallbacksAndMessagesがトリックを実行できますが、個人的には、スケジュールされた実行可能ファイルを制御することを好みます。Runnablesのペアをインスタンス化して処理しても、アプリのパフォーマンスは低下しません。それ以外の場合、2つまたは3つ以上のRunnableが必要な場合は、より強力なimhoが必要になることがあります。
andrea.rinaldi 2015

59

同じハンドラに渡された複数の内部/匿名ランナブルがあり、同じイベントの使用時にすべてをキャンセルしたい場合

handler.removeCallbacksAndMessages(null);

ドキュメントに従って、

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


これにより、すべての実行可能なコールバックが一度削除されます。それ以外の場合は、removeCallbacks(callback) 特定のコールバックを削除するように呼び出し ます
FindOutIslamNow

18

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

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

14
booleanCancelMemberはfinalでなければならないので、変更できないため、この目的には使用できません。
ステルスコプター

9
@stealthcopterいいえ、そうである必要はありません。
Benoit Jadinon 2012

7
@pablisco Runnableが匿名であっても、最終的なものである必要はありません。囲んでいるクラスのメンバーにすることができます。
マーティン

6
これには反対票を投じませんが、注意してください。このアプローチでは、複数のRunnableが遅延してポストされると、厄介な競合状態に遭遇する可能性があります。これはRunnableをキャンセルしません。そのため、そのコードが実行されるかどうかは、ポストされた Runnableの特定の時点でのbooleanCancelMemberの値に依存します。これはすぐに予測不可能になる可能性があります。
Dennis K

1
Runnableが匿名ではない場合、それは(rこの場合は)それへの参照があることを意味しますmyHandler.removeCallbacks(r);。つまり、を使用できます。Runnableが匿名の場合、フラグは囲んでいるクラスのメンバーになります。つまり、フラグを変更するには、そのオブジェクトへの参照が必要rですmyHandler.removeCallbacks(r);。つまり、とにかく持っている必要があります。つまり、できることです。そして、私がしているならmyHandler.removeCallbacks(r);、そのようなフラグはまったく必要ありません。何か不足していますか?
nacho4d 2016年

1

これは遅延アクションのキャンセルメソッドを提供するクラスです

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

私はブール値を介してそれを渡すことによって投稿の遅延実行可能内でCancelCallBacks(this)を呼び出したときに私のために働いた

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);
        }
    }
};

3
コードに「CancelCallBacks」はありません。多分それは存在しないのですか?:)
信じられないほどのJan

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.