这个Handler类应该是静态的,否则可能会发生泄漏:IncomingHandler

这个Handler类应该是静态的,否则可能会发生泄漏:IncomingHandler

我正在用服务开发一个Android2.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());,我收到以下林特警告:

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

什么意思?


手掌心
浏览 522回答 3
3回答

慕田峪7331174

下面是一个使用弱引用和静态处理程序类来解决问题的通用示例(如Lint文档中所建议的):public&nbsp;class&nbsp;MyClass{ &nbsp;&nbsp;//static&nbsp;inner&nbsp;class&nbsp;doesn't&nbsp;hold&nbsp;an&nbsp;implicit&nbsp;reference&nbsp;to&nbsp;the&nbsp;outer&nbsp;class &nbsp;&nbsp;private&nbsp;static&nbsp;class&nbsp;MyHandler&nbsp;extends&nbsp;Handler&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;//Using&nbsp;a&nbsp;weak&nbsp;reference&nbsp;means&nbsp;you&nbsp;won't&nbsp;prevent&nbsp;garbage&nbsp;collection &nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;final&nbsp;WeakReference<MyClass>&nbsp;myClassWeakReference;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;MyHandler(MyClass&nbsp;myClassInstance)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myClassWeakReference&nbsp;=&nbsp;new&nbsp;WeakReference<MyClass>(myClassInstance); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;@Override &nbsp;&nbsp;&nbsp;&nbsp;public&nbsp;void&nbsp;handleMessage(Message&nbsp;msg)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MyClass&nbsp;myClass&nbsp;=&nbsp;myClassWeakReference.get(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(myClass&nbsp;!=&nbsp;null)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...do&nbsp;work&nbsp;here... &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;} &nbsp;&nbsp;/** &nbsp;&nbsp;&nbsp;*&nbsp;An&nbsp;example&nbsp;getter&nbsp;to&nbsp;provide&nbsp;it&nbsp;to&nbsp;some&nbsp;external&nbsp;class &nbsp;&nbsp;&nbsp;*&nbsp;or&nbsp;just&nbsp;use&nbsp;'new&nbsp;MyHandler(this)'&nbsp;if&nbsp;you&nbsp;are&nbsp;using&nbsp;it&nbsp;internally. &nbsp;&nbsp;&nbsp;*&nbsp;If&nbsp;you&nbsp;only&nbsp;use&nbsp;it&nbsp;internally&nbsp;you&nbsp;might&nbsp;even&nbsp;want&nbsp;it&nbsp;as&nbsp;final&nbsp;member: &nbsp;&nbsp;&nbsp;*&nbsp;private&nbsp;final&nbsp;MyHandler&nbsp;mHandler&nbsp;=&nbsp;new&nbsp;MyHandler(this); &nbsp;&nbsp;&nbsp;*/ &nbsp;&nbsp;public&nbsp;Handler&nbsp;getHandler()&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;new&nbsp;MyHandler(this); &nbsp;&nbsp;}}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android