12


4

ハンドラーに到着する前に遅延メッセージを削除する方法は?

私の問題は、1秒の遅延でメッセージを送信する必要があることです。 その後、ハンドラーは何らかのアクションを開始し、写真を取得します。

それでも、ハンドラーが何もしないようにするために、既に送信されたメッセージを削除する必要がある(2番目の経過の前に)いくつかの条件があります。 私はこれを行う方法を理解できませんでした(またはそれが可能かどうか)ので、あなたの誰かが手掛かりを持っているなら、私に知らせてください。

3 Answer


36


removeMessages()`メソッドについて怖いことは何もありません。彼らは完全に安全です。 フレームワークはこれらのメソッドに大きく依存しており、特にデフォルトのウィジェット( `View、` ListView`など)で多くの場所で使用されています。特定のメッセージを無視する `Handler`を構築するよりもはるかに優れています。 これはプログラミングです、あなたの気持ちで行かないでください:p


5


多くの開発者とあなたが見つけるソースコードの多くは、匿名関数をハンドラーに渡す人々を示すので、これらを削除する方法がわからない場合があると思います。 簡単な解決策は、他のオブジェクトと同じように実行可能ファイルを宣言し、ハンドラーキューからそのインスタンスをクリアするために使用できるポインターを保持することです。

private Runnable lastMyRunnablePtr = null;

…​

private class MyRunnable implements Runnable
{}

lastMyRunnablePtr = new MyRunnable(); mHandler.postDelayed(lastMyRunnablePtr、30000);


protected void onDestroy() {
  mHandler.removeCallbacks(lastMyRunnablePtr);
}


1


実際、 `handler.removeMessages(int、obj)`の実装を検討する必要があります。 objがオートボクシングに関連するオブジェクトである場合、Android `MessageQueue`の実装の問題に遭遇します。

次のコードスニペットでは、自動ボクシングの結果としてremoveMessagesは機能しません。http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.7 [boxing-conversion]およびp.obj == objectを使用してオブジェクトを比較するMessageQueueの実装。

Message msg = handler.obtainMessage(what, 256);
handler.sendMessageDelayed(message, delayMillis);
handler.removeMessages(what, 256);

このhttps://stackoverflow.com/questions/36190851/android-os-handler-removemessages-doesnt-work-when-poxing-value-type-as-msg-obj[post]を参照してください。