[Android] Diese Handler-Klasse sollte statisch sein oder es könnten Lecks auftreten: IncomingHandler


Answers

Wie andere bereits erwähnt haben, liegt die Warnmeldung wegen des möglichen Speicherlecks vor. Sie können die Lint-Warnung vermeiden, indem Sie Handler.Callback beim Konstruieren von Handler (dh, Sie Handler.Callback Handler nicht, und es gibt keine nicht statische Handler -Klasse):

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

So wie ich es verstehe, wird das mögliche Speicherleck nicht vermieden. Message einen Verweis auf das mIncomingHandler Objekt, das einen Verweis auf das Handler.Callback Objekt enthält, das eine Referenz auf das Service Objekt enthält. Solange sich Nachrichten in der Looper Nachrichtenwarteschlange befinden, ist der Service nicht GC. Dies ist jedoch kein ernsthaftes Problem, es sei denn, Sie haben lange Verzögerungsnachrichten in der Nachrichtenwarteschlange.

Question

Ich entwickle eine Android 2.3.3 Anwendung mit einem Service. Ich habe dies innerhalb dieses Dienstes, um mit Hauptaktivität zu kommunizieren:

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());
    [ ... ]
}

Und hier, final Messenger mMessenger = new Messenger(new IncomingHandler()); Ich erhalte die folgende Warnmeldung:

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

Was heißt das?




Dieser Weg hat gut für mich funktioniert, hält den Code sauber, indem er dort bleibt, wo Sie die Nachricht in ihrer eigenen inneren Klasse behandeln.

Der Handler, den Sie verwenden möchten

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

Die innere Klasse

class IncomingHandlerCallback implements Handler.Callback{

    @Override
    public boolean handleMessage(Message message) {

        // Handle message code

        return true;
    }



Ich bin mir nicht sicher, aber Sie können versuchen, den Handler auf null zu setzen in onDestroy ()