postDelayedによって追加されたハンドラーオブジェクトからランナブルを削除するにはどうすればよいですか?
-
26-09-2019 - |
質問
を持っています "開ける" アニメーションを使用しています Handler.postDelayed(Runnable, delay)
を引き起こす "近い" 少し遅れてアニメーションが表示されます。ただし、開いてから閉じるまでの間に、クリックによって別のアニメーションがトリガーされる可能性があります。
私の質問は、どうすればキャンセルできるかということです "近い" ハンドラー内のアニメーション?
他のヒント
クリスティアンの答えが正しいですが、答えのコメントで述べられているものとは反対に、あなたが実際にRunnables
を呼び出すことにより、匿名removeCallbacksAndMessages(null);
のためのコールバックを削除することができます。
ここをhref="http://developer.android.com/reference/android/os/Handler.html#removeCallbacksAndMessages%28java.lang.Object%29">
コールバックの保留中の投稿を削除し、そのOBJトークンでメッセージを送りました。トークンがnullの場合の、すべてのコールバックとメッセージは削除されます。
この後半の答えですが、ここであなただけ(すなわち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」のみを実行します。これは、あなたがランナブル自身への参照を保持するために必要とせずに、あなたのトークンで定義されたランナブルの特定のカテゴリを削除することができます。
注:ソースコードはそう最高のは、トークンのためのint型/整数の代わりに文字列を使用するように、「==」オペランドのみ(それが呼び出すことはありません.equals())を使用してトークンを比較します。
、あなたは「これを」渡すことで、これをacheiveすることができます。以下のコードを参照してください。
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を削除し、カウントダウンを無効にします。これは、再帰を使用している誰かのためにのみ有用ですが、私は私の結果を掲載していますので、その探しここに到着しました。
だけ実行します。
handler = null
すべてが削除されます。