247

メインアクティビティによって呼び出されたサブアクティビティのハンドラーがあります。このハンドラーは、一部のRunnableのサブクラスで使用されており、管理できません。さて、イベントでは、アクティビティを終了する前にそれらを削除する必要があります(どういうわけか私は呼び出しましたが、それでも何度も呼び出します)。ハンドラーからすべてのコールバックを削除する方法はありますか?postDelayonStopfinish()

4

6 に答える 6

565

私の経験では、これはうまくいきました!

handler.removeCallbacksAndMessages(null);

removeCallbacksAndMessages のドキュメントには、次のように書かれています...

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

于 2012-04-13T17:38:14.417 に答える
20

特定のRunnableインスタンスについては、 を呼び出しますHandler.removeCallbacks()。インスタンス自体を使用して登録解除するコールバックを決定することに注意してください。そのRunnableため、投稿が行われるたびに新しいインスタンスを作成している場合は、Runnableキャンセルする正確なものへの参照があることを確認する必要があります。例:

Handler myHandler = new Handler();
Runnable myRunnable = new Runnable() {
    public void run() {
        //Some interesting task
    }
};

myHandler.postDelayed(myRunnable, x)コード内の別の場所にあるメッセージ キューに別のコールバックをポストするために呼び出し、保留中のすべてのコールバックを次のように削除できます。myHandler.removeCallbacks(myRunnable)

残念ながら、アイテムを追加および削除するためのメソッドはパッケージで保護されているため (android.os パッケージ内のクラスのみがそれらを呼び出すことができる)、関連するオブジェクトをリクエストしたとしても、単に の全体MessageQueueを「クリア」することはできません。投稿/実行される s のリストを管理するために、薄いサブクラスを作成する必要がある場合があります...または、それぞれの間でメッセージを渡すための別のパラダイムを調べますHandlerMessageQueueHandlerRunnableActivity

それが役立つことを願っています!

于 2011-05-04T12:58:07.013 に答える
8

Runnable 参照がない場合は、最初のコールバックでメッセージの obj を取得し、removeCallbacksAndMessages()を使用して関連するすべてのコールバックを削除します。

于 2011-05-04T13:17:05.783 に答える
7

一度作成されるように、クラススコープでaHandlerと aを定義する必要があることに注意してください。複数回定義しない限り、正しく機能します。理解を深めるために、次の例をご覧ください。RunnableremoveCallbacks(Runnable)

間違った方法:

    public class FooActivity extends Activity {
           private void handleSomething(){
                Handler handler = new Handler();
                Runnable runnable = new Runnable() {
                   @Override
                   public void run() {
                      doIt();
                  }
               };
              if(shouldIDoIt){
                  //doIt() works after 3 seconds.
                  handler.postDelayed(runnable, 3000);
              } else {
                  handler.removeCallbacks(runnable);
              }
           }

          public void onClick(View v){
              handleSomething();
          }
    } 

メソッドを呼び出す場合、呼び出す前にメソッドの呼び出しをonClick(..)停止することはありませんdoIt()。毎回インスタンスnew Handlerを作成するためです。このようにして、ハンドラー実行可能なインスタンス new Runnableに属する必要な参照が失われました。

正しい方法:

 public class FooActivity extends Activity {
        Handler handler = new Handler();
        Runnable runnable = new Runnable() {
            @Override
            public void run() {
                doIt();
            }
        };
        private void handleSomething(){
            if(shouldIDoIt){
                //doIt() works after 3 seconds.
                handler.postDelayed(runnable, 3000);
            } else {
                handler.removeCallbacks(runnable);
            }
       }

       public void onClick(View v){
           handleSomething();
       }
 } 

このようにして、実際の参照が失われることはなく、removeCallbacks(runnable)正常に動作します。

重要な文は、 「それらをあなたまたはあなたが使用するものでグローバルとして定義するActivityFragment」です.

于 2016-12-14T19:48:03.657 に答える