This Handler class should be static or leaks might occur(null) 解决办法

  首先解释下这句话This Handler class should be static or leaks might occur,大致意思就是说:Handler类应该定义成静态类,否则可能导致内存泄露。

  具体如何解决,在国外有人提出,如下:

  Issue: Ensures that Handler classes do not hold on to a reference to an outer class

  In Android, Handler classes should be static or leaks might occur. Messages enqueued on the application thread‘s MessageQueue also retain their target Handler. If the Handler is an inner class, its outer class will be retained as well. To avoid leaking the outer class, declare the Handler as a static nested class with a WeakReference to its outer class.

  大体翻译如下:

  Handler 类应该应该为static类型,否则有可能造成泄露。在程序消息队列中排队的消息保持了对目标Handler类的应用。如果Handler是个内部类,那 么它也会保持它所在的外部类的引用。为了避免泄露这个外部类,应该将Handler声明为static嵌套类,并且使用对外部类的弱应用。

  

  使用范例:

 1 static class MyHandler extends Handler {
 2     WeakReference<PopupActivity> mActivity;
 3
 4     MyHandler(PopupActivity activity) {
 5       mActivity = new WeakReference<PopupActivity>(activity);
 6     }
 7
 8     @Override
 9     public void handleMessage(Message msg) {
10       PopupActivity theActivity = mActivity.get();
11        switch (msg.what) {
12        case 0:
13          theActivity.popPlay.setChecked(true);
14          break;
15        }
16     }
17 }
18
19    MyHandler ttsHandler = new MyHandler(this);
20    private Cursor mCursor;
21
22    private void test() {
23         ttsHandler.sendEmptyMessage(0);
24   }

  

  WeakReference则类似于可有可无的东西。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存,说白了就是一个没那么strong要求垃圾回收器将一个对象保留在内存中。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

参考文章:http://www.cnblogs.com/jevan/p/3168828.html

原文链接:http://blog.csdn.net/wuleihenbang/article/details/17126371

时间: 2024-08-05 11:08:59

This Handler class should be static or leaks might occur(null) 解决办法的相关文章

This Handler class should be static or leaks might occur

Android中,在使用到Handler的时候,如果按如下代码编写: private Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-gene

Android - This Handler class should be static or leaks might occur.

今天学习了使用 HTTP协议,从Android客户端往Tomcat服务器端以GET发送请求,途中无意中发现自己写的Handler类被Android提示:This Handler class should be static or leaks might occur. 往google上type,发现很多网友都做了解释,也感触颇深,编译器的提示,有时真的要留意,这对自己学习也有很大的帮助. 虽然多了几行代码,但为了实用,我就上贴自己实际点的例子,Activity: package spt.http.

This Handler class should be static or leaks might occur,Handler和Context使用的注意事项!

Android中.在使用到Handler的时候,假设按例如以下代码编写: private Handler handler; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-ge

The handler class should be static or leaks might occur原因及解决方法

翻译自http://www.androiddesignpatterns.com/2013/01/inner-class-handler-memory-leak.html 在主线程中使用Handler对象,比如下面的代码 public class SampleActivity extends Activity { private final Handler mLeakyHandler = new Handler() { @Override public void handleMessage(Mes

Handler Class Should be Static or Leaks Occur

在使用Handler更新UI的时候,我是这样写的: public class SampleActivity extends Activity {   private final Handler mLeakyHandler = new Handler() {     @Override     public void handleMessage(Message msg) {       // TODO     }   } } 看起来很正常的,但是 Android Lint 却给出了警告: This

关于子线程使用Toast报错Can&#39;t create handler inside thread that has not called Looper.prepare()的解决办法

形同如下代码,在Thread中调用Toast显示错误信息: new Thread(new Runnable(){ @Override public void run() { try{ weatherData = getWeatherData(strUrl); parseJson(weatherData); }catch(Exception e){ Toast.makeText(WindowApplication.getAppContext(), e.toString(), Toast.LENGT

关于NO 不掉 IP NAT 报这个错%Static entry in use, cannot remov ...解决办法

R1(config)#interface fastethernet 0/0 R1(config-if)#no ip nat outside R1(config)#interface fastethernet 0/1 R1(config-if)#no ip nat inside R1#clear ip nat translation * R1(config)#no ip nat inside source static 192.168.1.205 180.169.84.237

【Android】[转] Android Handler应设为static

android开发中,使用Lint检测时会提示这么一句话 : This Handler class should be static or leaks might occur.意为handler应用static修饰否则容易发生内存泄漏. ADT20有这么一个变化:Look for handler leaks: This check makes sure that a handler inner class does not hold an implicit reference to its ou

Android中Handler警告的解决办法

经常,在我们使用Handler的时候,会出现This Handler class should be static or leaks might occur,对于有代码洁癖的人.来说时忍受不了的. 那么我们该怎么解决呢? 查阅了很多文章,大致的解释是:在程序消息队列中排队的消息保持了对目标Handler类的应用.如果Handler是个内部类,那么它也会保持它所在的外部类(通常是Activity或者Service等)的引用.只要有消息在队列中,那么Handler便无法被回收,如果Handler不是