web-dev-qa-db-ja.com

postDelayedによって追加されたハンドラーオブジェクトから実行可能ファイルを削除する方法は?

"open"アニメーションがあり、Handler.postDelayed(Runnable, delay)を使用して、少し遅れて"close"アニメーションをトリガーしています。ただし、開いてから閉じるまでの間に、クリックによってトリガーされる別のアニメーションが存在する可能性があります。

私の質問は、ハンドラーで"close"アニメーションをどのようにキャンセルするかです。

64
Bruce Lee

removeCallbacks(Runnable r) メソッドを使用するだけです。

91
Cristian

Cristianの答えは正しいですが、答えのコメントに記載されていることとは対照的に、removeCallbacksAndMessages(null);を呼び出すことで、匿名Runnablesのコールバックを実際に削除できます。

前述のとおり ここ

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

88
Daniel L.

これは遅い答えですが、ハンドラから特定のカテゴリのランナブルのみを削除する場合の別の方法です(つまり、OPの場合は、クローズアニメーションを削除して、他のランナブルをキューに残します)。

    int firstToken = 5;
    int secondToken = 6;

    //r1 to r4 are all different instances or implementations of Runnable.  
    mHandler.postAtTime(r1, firstToken, 0);
    mHandler.postAtTime(r2, firstToken, 0);
    mHandler.postAtTime(r3, secondToken, 0);

    mHandler.removeCallbacksAndMessages(firstToken);

    mHandler.postAtTime(r4, firstToken, 0);

上記のコードは、「r3」と「r4」のみを実行します。これにより、ランナブル自体への参照を保持する必要なく、トークンで定義されたランナブルの特定のカテゴリを削除できます。

注:ソースコードは、「==」オペランドのみを使用してトークンを比較します(.equals()を呼び出しません)。したがって、トークンには文字列ではなくints/Integersを使用するのが最適です。

16
NameSpace

再帰を使用している場合、「this」を渡すことでこれを実現できます。以下のコードを参照してください。

public void countDown(final int c){
    mHandler.postDelayed(new Runnable() {
        @Override
        public void run() {
            aq.id(R.id.timer).text((c-1)+"");
            if(c <= 1){
                aq.id(R.id.timer).gone();
                mHandler.removeCallbacks(this);
            }else{
                countDown(c-1);
            }
        }
    }, 1000);
}

この例では、TextView(タイマー)のテキストを毎秒設定し、カウントダウンします。 0に達すると、UIからTextViewを削除し、カウントダウンを無効にします。これは再帰を使用している人にのみ役立ちますが、それを探してここに到着したので、結果を投稿しています。

10
robisaks

匿名のRunnableのコールバックを削除する場合は、次を実行します:handler = nullすべてが削除されます。

0
Karol Wasowski