[android] Esta clase de controlador debe ser estática o pueden producirse fugas: IncomingHandler



2 Answers

Como otros han mencionado, la advertencia de Lint se debe a la posible pérdida de memoria. Puede evitar la advertencia de Lint pasando un Handler.Callback al construir Handler (es decir, no hace una subclase de Handler y no hay Handler class interno no estático):

Handler mIncomingHandler = new Handler(new Handler.Callback() {
    @Override
    public boolean handleMessage(Message msg) {
    }
});

Según lo entiendo, esto no evitará la posible pérdida de memoria. Message objetos de Message contienen una referencia al objeto mIncomingHandler que contiene una referencia al objeto Handler.Callback que contiene una referencia al objeto de Service . Mientras haya mensajes en la cola de mensajes de Looper , el Service no será GC. Sin embargo, no será un problema grave a menos que tenga mensajes de larga espera en la cola de mensajes.

Question

Estoy desarrollando una aplicación Android 2.3.3 con un servicio. Tengo esto dentro de ese servicio para comunicarme con la actividad Principal:

public class UDPListenerService extends Service
{
    private static final String TAG = "UDPListenerService";
    //private ThreadGroup myThreads = new ThreadGroup("UDPListenerServiceWorker");
    private UDPListenerThread myThread;
    /**
     * Handler to communicate from WorkerThread to service.
     */
    private Handler mServiceHandler;

    // Used to receive messages from the Activity
    final Messenger inMessenger = new Messenger(new IncomingHandler());
    // Use to send message to the Activity
    private Messenger outMessenger;

    class IncomingHandler extends Handler
    {
        @Override
        public void handleMessage(Message msg)
        {
        }
    }

    /**
     * Target we publish for clients to send messages to Incoming Handler.
     */
    final Messenger mMessenger = new Messenger(new IncomingHandler());
    [ ... ]
}

Y aquí, el final Messenger mMessenger = new Messenger(new IncomingHandler()); , Recibo la siguiente advertencia de Pelusa:

This Handler class should be static or leaks might occur: IncomingHandler

Qué significa eso?




De esta manera funcionó bien para mí, mantiene el código limpio al mantener el lugar donde manejas el mensaje en su propia clase interna.

El controlador que deseas usar

Handler mIncomingHandler = new Handler(new IncomingHandlerCallback());

La clase interna

class IncomingHandlerCallback implements Handler.Callback{

    @Override
    public boolean handleMessage(Message message) {

        // Handle message code

        return true;
    }



No estoy seguro, pero puedes probar intialising handler para anular en ontroy ()




Related