• Android“This Handler class should be static or leaks might occur”警告的处理方法


    此文属于转载!

    最近用到handle在线程中改变UI,会跟给出“This Handler class should be static or leaks might occur”的警告,网上看了很多解决办法,但都不够详细,这里我重新写一下这个问题的解决办法。

    1.问题原因:在ADT 20 Changes我们可以找到这样一个变化:“New Lint Checks: Look for handler leaks: This check makes sure that a handler inner class does not hold an implicit reference to its outer class.” 就是说在ADT20以后加入了一条新的检查规则:确保类内部的handler不含有对外部类的隐式引用 。


    2.解决办法:我这里提供三种解决办法推荐第三种。

    第一种:(不推荐)根据eclipse的提示,直接加入 “@SuppressLint("HandlerLeak")”的注释或者在 Window-->Preferences-->Android-->Lint Error Checking里面检索HandlerLeak,然后选择ignore。如下图:


    不推荐 这种方法,这种方法实际上没有解决问题。


    第二种 :把Handler定义成static,然后用post方法把Runnable对象传送到主线程,代码如下:

    1.        private static Handler handler;  
    2. private TextView textView;  
    3. public void onCreate(Bundle savedInstanceState) {  
    4.     super.onCreate(savedInstanceState);  
    5.     setContentView(R.layout.main);   
    6.     handler = new Handler(); // Create a handler to update the UI  
    7. }  
    8.   
    9. void test() {  
    10.     handler.post(new MyRunnable());  
    11. }  
    12.   
    13. static public class MyRunnable implements Runnable {  
    14.     @Override  
    15.     public void run() {  
    16.         textView.setText(R.string.success);//改变textView显示的内容  
    17.         /*此处放入要改变UI的操作即可*/  
    18.     }  
    19. }  

    这种方法将要发送的消息转换成了对应的Runable对象,适用于只有一个消息要发送的情形,如果有多个消息要发送可以采用第三种方法。


    第三种 :(推荐)这里我们可以采用弱引用的方式来解决问题,我们先定义一个static的内部类MyHandler,然后让它持有Activity的弱引用,这样问题就得到了解决。代码如下:

    1. static class MyHandler extends Handler {  
    2.     //注意下面的“PopupActivity”类是MyHandler类所在的外部类,即所在的activity  
    3.     WeakReference<PopupActivity> mActivity;  
    4.   
    5.     MyHandler(PopupActivity activity) {  
    6.         mActivity = new WeakReference<PopupActivity>(activity);  
    7.     }  
    8.   
    9.     @Override  
    10.     public void handleMessage(Message msg) {  
    11.         PopupActivity theActivity = mActivity.get();  
    12.         switch (msg.what) {  
    13.         //此处可以根据what的值处理多条信息  
    14.         case 0x0001:  
    15.             //这里可以改变activity中的UI控件的状态  
    16.             theActivity.textView.setText(R.string.hello_world);  
    17.             break;  
    18.         }  
    19.         case 0x0002:  
    20.             //这里可以改变activity中的UI控件的状态  
    21.             theActivity.textView.setText(R.string.welcome);  
    22.             break;  
    23.         /*这里可以有多条要处理信息的操作*/  
    24.         /*... ...*/  
    25.     }  
    26.     }  
    27. };  
    28. //实例化一个MyHandler对象  
    29. MyHandler testHandler = new MyHandler(this);  
    30.   
    31. private void test1() {  
    32.     //这里发送了一个空消息,空消息的what值是0x0001  
    33.     testHandler.sendEmptyMessage(0x0001);  
    34. }  
    35.   
    36. private void test2() {  
    37.     //这里发送了一个空消息,空消息的what值是0x0001  
    38.     testHandler.sendEmptyMessage(0x0002);  
    39. }  

    如果您有更好的解决方案,欢迎留言,参考文献:http://stackoverflow.com/questions/11407943/this-handler-class-should-be-static-or-leaks-might-occur-incominghandler

  • 相关阅读:
    ffmpeg-3.2.4-static-win32-for-XP-bin.tar.xz
    FFmpeg Scaler Options
    MinGW GCC 6.3.0 2017年3月份出炉啦
    ffmpeg-201701[10,16,21,23,25]-bin.7z
    ffmpeg-201612[01,08,10,17,21,27,30]-bin.7z
    Firefox Portable Developer 52.0.0.6176-6178
    DIR 按文件名中数字大小进行排序
    ffmpeg-20161104[07,10,16,21,22,27,30]-bin.7z
    gnuWin32-mini-2016.10.30
    gnu coreutils-8.25 for win32 static
  • 原文地址:https://www.cnblogs.com/welhzh/p/3585478.html
Copyright © 2020-2023  润新知