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
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
C# statik sınıf yapıcısı...
't neden C# statik sınıf uzatma y...
Java statik bir yöntem sınıf adını alm...
Uzatma yöntemleri genel olmayan statik...
javascript sınıf/statik yöntem?...