Android Threading: Esta clase de Handler debe ser estática o pueden producirse fugas

Estoy usando un objeto handler para continuar el trabajo de interfaz de usuario después de haber terminado una tarea que consume mucho tiempo en un subproceso separado. Tenía un problema de la advertencia anterior de Lint y el siguiente fue mi enfoque.

[Tipo de objeto de controlador de ejemplo 1] ->

 Handler responseHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); Toast.makeText(MainActivity.this, "Finished the long running task in seperate thread...", Toast.LENGTH_LONG).show(); } }; 

[Tipo de objeto de controlador de ejemplo 2] ->

 Handler responseHandler = new Handler(new Handler.Callback() { @Override public boolean handleMessage(Message msg) { Toast.makeText(MainActivity.this, "Finished long running task in a seperate thread...", Toast.LENGTH_LONG).show(); return false; // RETURN VALUE ???? } }); 

En el hilo separado (que no sea UI) cuando se realiza la tarea que lleva mucho tiempo, ejecuta la siguiente línea para devolver el control al subproceso UI (básicamente al manipulador obj).

 responseHandler.sendEmptyMessage(0); 

El programa funciona muy bien con ambos tipos de objetos de manejador, pero con el primer tipo estoy recibiendo una advertencia de Lint diciendo que esta clase de manejador debe ser estática o pueden producirse fugas .

Por lo tanto, empecé a usar el segundo tipo de objeto manejador para evitar la advertencia Lint, pero el problema que tengo es, no estoy seguro acerca del significado de valor de retorno (true / false) en la 2 ª manera y también funciona con cualquiera. Busqué esto en google por tanto, pero no obtuve una respuesta exacta explicó este valor de retorno.

Sí, vi que esta pregunta había pedido en muchos lugares en stackoverflow principalmente reacrding la advertencia Lint, pero mi pregunta es principalmente sobre el tipo de retorno en la 2 ª manera y para conseguir que confirme si está bien la manera de resolver el problema con el 2 º tipo Del manejador Obj.

Preguntas ->

1). ¿Alguien sabe qué exactamente este valor de retorno significa (verdadero / falso)?

2). ¿Es la cosa correcta que he hecho para deshacerse de la advertencia pelusa?

Gracias…

Cada manejador está vinculado al Looper de un subproceso, cada Message se coloca en una estructura de datos, una cola de mensajes.

Message tiene una variable de target que apunta a un Handler , una variable de callback que apunta a un Runnable .

Por lo tanto, si está utilizando una clase anónima para crear un objeto Handler (como en el primer ejemplo), entonces sepa que las clases internas anónimas / no estáticas contienen una referencia a objetos externos (Actividad?). Por lo tanto, el mensaje publicado en la cola, puede ser la celebración de referencias al Handler como objetivo, y el Handler a su vez la celebración de una referencia a la clase externa, como la Activity .

Ahora, un mensaje puede permanecer en la cola de mensajes durante largos intervalos de tiempo, siempre y cuando el subproceso esté en ejecución. Mientras tanto, la actividad puede haber sido despedida. Pero no será recogida basura debido a la oscura referencia indirecta de la misma, que tiene el mensaje. Tenga en cuenta que el Looper y la cola de mensajes permanecen siempre que el subproceso esté en ejecución.

En el segundo ejemplo, no está creando una clase Handler anónima. Está utilizando el constructor del controlador y pasándolo un objeto de Callback anónimo. Esto podría detener a Lint de quejarse, pero dudo que este sea un buen enfoque. Simplemente evite las clases internas, evite pasar las referencias de Actividad o contexto al Handler.

Actualizar:

El remitenteMensaje dispatchMessage() del manejador recibe los mensajes debido a ser procesados, donde comprueba si se ha proporcionado una devolución de llamada, entonces si se proporciona devolución de llamada, no llama a handleMessage() , si handleMessage() devuelve true:

 public void dispatchMessage(Message msg) { if (msg.callback != null) { handleCallback(msg); } else { if (mCallback != null) { if (mCallback.handleMessage(msg)) { return; } } handleMessage(msg); //--won't be called if you return true. } } 

Encontré información importante acerca de la pérdida de memoria por clase interna como manejador y quiero compartir contigo:

Cómo escapar de un contexto: Handlers & Inner Classes Y creo que el método anulado de clase Handler no devolverá nada como se puede comprobar: handleMessage ()

Ha reemplazado la clase Java Handler no Handler Android, puede ver handleMessage () de la clase Java Handler está teniendo declaración de retorno y puede comprobar la razón también para la instrucción return aquí: boolean handleMessage (contexto C)

  • NoClassDefFoundError al agregar SocialAuth en Eclipse
  • ¿Cómo puedo configurar el color del trazo de la barra de calificación de Android? (No el color de las estrellas pero la FRONTERA)
  • Android GCM con sabores de producto
  • Cómo resolver el java.lang.VerifyError: org / apache / poi / xssf / usermodel / XSSFWorkbook?
  • Java / Eclipse - No más archivo R nunca
  • Android - ¿Cómo añadir mi propio codec de audio a AudioRecord?
  • Java - Línea aleatoria leer
  • Tela que intenta utilizar un mapa de bits reciclado
  • Lectura de archivos desde almacenamiento externo de Android SDK Emulator
  • Devolución de error de OKHttp interceptor (utilizando retrofit)
  • Servicio Android-Comunicación de 2 vías
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.