java - solicitud - ¿Cómo eliminar todas las devoluciones de llamada de un controlador?
reembolso fortnite (5)
Defina un nuevo manejador y ejecutable:
private Handler handler = new Handler(Looper.getMainLooper());
private Runnable runnable = new Runnable() {
@Override
public void run() {
// Do what ever you want
}
};
Call post retrasado:
handler.postDelayed(runnable, sleep_time);
Eliminar su devolución de llamada de su controlador:
handler.removeCallbacks(runnable);
Tengo un Handler de mi subactividad que fue llamado por la Activity principal. Este controlador es usado por las subclases para postDelay
algunos Runnables, y no puedo administrarlos. Ahora, en el evento onStop
, necesito eliminarlos antes de terminar la Actividad (de alguna manera llamé a finish()
, pero aún así llamo una y otra vez). ¿Hay alguna forma de eliminar todas las devoluciones de llamada de un controlador?
En mi experiencia llamar a esto funcionó muy bien!
handler.removeCallbacksAndMessages(null);
En los documentos para removeCallbacksAndMessages dice ...
Elimine cualquier publicación pendiente de devoluciones de llamada y mensajes enviados cuyo objeto sea token. Si el token es
null
, se eliminarán todas las devoluciones de llamada y los mensajes.
En realidad hay un punto pequeño pero muy importante aquí. Deberías definir un Handler
y un Runnable
solo la primera vez. En realidad, removeCallbacks(runnable)
funciona correctamente, pero si los define cada vez, es posible que no los maneje.
Manera falsa
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();
}
}
Si llama al método onClick(..)
, nunca detiene el método doIt()
antes de llamar. Porque cada vez crea new Handler
y new Runnable
instancias new Runnable
. De esta manera, perdió las referencias necesarias que pertenecen al controlador y las instancias ejecutables .
Forma verdadera:
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();
}
}
De esta manera, no se pierden las referencias reales y removeCallbacks(runnable)
funciona correctamente.
La oración clave es que ''defínalos como globales en su Activity
o Fragment
lo que usa'' .
Para cualquier instancia específica de Runnable
, llame a Handler.removeCallbacks()
. Tenga en cuenta que utiliza la Runnable
instancia de Runnable
para determinar qué devoluciones de llamada debe anular el registro, por lo que si está creando una nueva instancia cada vez que se realiza una publicación, debe asegurarse de que tiene referencias al Runnable
exacto para cancelar. Ejemplo:
Handler myHandler = new Handler();
Runnable myRunnable = new Runnable() {
public void run() {
//Some interesting task
}
};
Puede llamar a myHandler.postDelayed(myRunnable, x)
para enviar otra devolución de llamada a la cola de mensajes en otros lugares en su código, y eliminar todas las devoluciones de llamada pendientes con myHandler.removeCallbacks(myRunnable)
Desafortunadamente, no puede simplemente "borrar" todo el MessageQueue
para un Handler
, incluso si realiza una solicitud para el objeto MessageQueue
asociado con él porque los métodos para agregar y eliminar elementos están protegidos por paquetes (solo las clases dentro del paquete android.os pueden llamar ellos). Es posible que tenga que crear una subclase de Runnable
delgado para administrar una lista de Runnable
s a medida que se publican / ejecutan ... o busque otro paradigma para pasar sus mensajes entre cada Activity
¡Espero que ayude!
Si no tiene las referencias de Runnable, en la primera devolución de llamada, obtenga el objeto del mensaje y use removeCallbacksAndMessages() para eliminar todas las devoluciones de llamada relacionadas.