我正在开发一个带有服务的 Android 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
这是什么意思?
If IncomingHandler
类不是静态的,它将引用您的Service
object.
Handler
同一线程的对象都共享一个公共的 Looper 对象,它们向该对象发送消息并从中读取消息。
由于消息包含目标Handler
,只要消息队列中存在带有目标handler的消息,该handler就无法被垃圾回收。如果处理程序不是静态的,您的Service
or Activity
即使在被销毁之后也不能被垃圾收集。
这可能会导致内存泄漏,至少在一段时间内 - 只要消息保留在队列中。除非您发布长时间延迟的消息,否则这不是什么大问题。
你(们)能做到IncomingHandler
静态并有一个WeakReference
为您服务:
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);
}
}
}
看到这个post http://groups.google.com/group/android-developers/msg/959f98f16a038694?pli=1罗曼·盖伊 (Romain Guy) 撰写,供进一步参考
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)