SORU
10 Temmuz 2012, Salı


Bu İşleyici sınıf statik olmalıdır ya da sızıntı meydana gelebilir: İncomingHandler

Hizmet 2.3.3 Android uygulaması geliştiriyorum. Bu hizmeti Ana faaliyet ile iletişim içinde bu var:

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

Ve burada, final Messenger mMessenger = new Messenger(new IncomingHandler()); aşağıdaki Lint uyarı alıyorum:

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

Bu ne anlama geliyor?

CEVAP
10 Temmuz 2012, Salı


Eğer IncomingHandler sınıf statik değil, Service nesneye bir referans olacaktır.

Aynı konu için Handler nesneler ileti göndermek ve okumak Looper ortak bir nesne, paylaşmak.

Mesajlar Handler sürece, ileti sıradaki hedef işleyicisi ile bir mesaj var hedef içerir gibi, işleyici çöp toplanamaz. Eğer işleyicisi statik değil, ** veya 9 Activity - çöpler bile yok edildikten sonra olamaz.

Bu bellek sızıntısı, bir süre için en azından iletileri sıraya int sürece neden olabilir. Bu sana yazılan uzun mesajlar gecikmeli sürece çok bir sorun değil.

IncomingHandler statik ve hizmet için WeakReference olabilir:

static class IncomingHandler extends Handler {
    private final WeakReference<UDPListenerService> mService; 

    IncomingHandler(UDPListenerService service) {
        mService = new WeakReference<UDPListenerService>(service);
    }
    @Override
    public void handleMessage(Message msg)
    {
         UDPListenerService service = mService.get();
         if (service != null) {
              service.handleMessage(msg);
         }
    }
}

Daha fazla referans için Adam Romain tarafından bu post bkz

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bratayley

    Bratayley

    30 Aralık 2010
  • FrankJavCee

    FrankJavCee

    29 Kasım 2008
  • ODN

    ODN

    26 Kasım 2006