メインアクティビティによって呼び出されたサブアクティビティのハンドラーがあります。このハンドラーは、一部のRunnableのサブクラスで使用されており、管理できません。さて、イベントでは、アクティビティを終了する前にそれらを削除する必要があります(どういうわけか私は呼び出しましたが、それでも何度も呼び出します)。ハンドラーからすべてのコールバックを削除する方法はありますか?postDelay
onStop
finish()
6 に答える
私の経験では、これはうまくいきました!
handler.removeCallbacksAndMessages(null);
removeCallbacksAndMessages のドキュメントには、次のように書かれています...
obj が token であるコールバックと送信済みメッセージの保留中の投稿を削除します。トークンが の場合
null
、すべてのコールバックとメッセージが削除されます。
特定の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 のリストを管理するために、薄いサブクラスを作成する必要がある場合があります...または、それぞれの間でメッセージを渡すための別のパラダイムを調べますHandler
MessageQueue
Handler
Runnable
Activity
それが役立つことを願っています!
Runnable 参照がない場合は、最初のコールバックでメッセージの obj を取得し、removeCallbacksAndMessages()を使用して関連するすべてのコールバックを削除します。
一度作成されるように、クラススコープでaHandler
と aを定義する必要があることに注意してください。複数回定義しない限り、正しく機能します。理解を深めるために、次の例をご覧ください。Runnable
removeCallbacks(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)
正常に動作します。
重要な文は、 「それらをあなたまたはあなたが使用するものでグローバルとして定義するActivity
Fragment
」です.