[Android] 이 Handler 클래스는 정적이거나 누수가 발생할 수 있습니다. IncomingHandler



Answers

린트 (Lint) 경고는 잠재적 인 메모리 누수로 인한 것이라고 다른 사람들이 언급했습니다. Handler Handler.Callback 할 때 Handler.Callback 을 전달하여 Lint 경고를 피할 수 있습니다 (즉, Handler 하위 클래스는 아니며 Handler 비 정적 인 내부 클래스는 없습니다).

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

내가 알기에 이것은 잠재적 인 메모리 누출을 피할 수는 없을 것이다. Message 객체는 Service 객체에 대한 참조를 보유하는 Handler.Callback 객체에 대한 참조를 보유하는 Handler.Callback 객체에 대한 참조를 보유합니다. Looper 메시지 대기열에 메시지가있는 한 Service 는 GC가 아닙니다. 그러나 메시지 대기열에 긴 지연 메시지가 없으면 심각한 문제가되지 않습니다.

Question

나는 서비스로 안드로이드 2.3.3 응용 프로그램을 개발 중이다. 나는 메인 활동과 통신 할 수있는이 서비스를 가지고있다 :

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

그리고 여기, final Messenger mMessenger = new Messenger(new IncomingHandler()); , 나는 다음의 린트 (Lint) 경고를 받는다.

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

무슨 뜻이에요?




확실하지는 않지만 onDestroy ()에서 null에 대한 intialising 핸들러를 시도 할 수 있습니다.




이 방법은 저에게 효과적이며 내부 클래스에서 메시지를 처리하는 위치를 유지함으로써 코드를 깨끗하게 유지합니다.

사용할 핸들러

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

내부 클래스

class IncomingHandlerCallback implements Handler.Callback{

    @Override
    public boolean handleMessage(Message message) {

        // Handle message code

        return true;
    }



Links