@SuppressLint(“HandlerLeak”)

简介: @SuppressLint(“HandlerLeak”)

(347条消息) @SuppressLint(“HandlerLeak”)_androidsj的博客-CSDN博客

(347条消息) 关于HandlerLeak的一点理解_yuyuanhuang的博客-CSDN博客

碰到方法的前面和类的前面有时会出现@SuppressLint或者@SuppressWarnings这样的黄色警告,看起来很不舒服,于是上网搜集了一些相关资料。发现这些警告的出现其实是由于我们编写代码时的一些不规范的写法导致,解决这些问题其实是能提高我们程序的安全性、可用性和性能的。接下来就让我为大家一一说明。

1、@SuppressLint(“DrawAllocation”)

原因:我们都知道View及其子类的OnDraw(Canvas canvas)方法会实时调用来更新界面的,然而有时我们会在onDraw(Canvas canvas)方法中实例化对象(如Paint paint=new Paint()),这样就会影响我们程序的效率。

解决办法:将这些对象改为类的成员变量。

2、@SuppressWarnings(“rawtypes”)和@SuppressWarnings({ “unchecked”, “rawtypes” })

不规范写法:Class clazz = Class.forName(“android.view.Display”);

正确写法:Class<?> clazz = Class.forName("android.view.Display");

3、@SuppressLint(“HandlerLeak”)

原因:Handler在Android中用于消息的发送与异步处理,常常在Activity中作为一个匿名内部类来定义,此时Handler会隐式地持有一个外部类对象(通常是一个Activity)的引用。当Activity已经被用户关闭时,由于Handler持有Activity的引用造成Activity无法被GC回收,这样容易造成内存泄露。

解决办法:将其定义成一个静态内部类(此时不会持有外部类对象的引用),在构造方法中传入Activity并对Activity对象增加一个弱引用,这样Activity被用户关闭之后,即便异步消息还未处理完毕,Activity也能够被GC回收,从而避免了内存泄露。

public static class MyHandler extends Handler {
        private WeakReference<Activity> reference
        public MyHandler(Activity activity) {
            reference = new WeakReference<Activity>(activity);
        }
        @Override
        public void handleMessage(Message msg) {
            if (reference.get() != null) {
                switch (msg.what) {
                case 0:
                    // do something...
                    break;
                default:
                    // do something...
                    break;
                }
            }
        }
    }

静态内部类实现,据说这是最标准的写法。

private MyHandler handler = new MyHandler(this);
    static class MyHandler extends Handler {
        WeakReference weakReference;
        public MyHandler(SecondActivity activity) {
            weakReference = new WeakReference(activity);
        }
 
        @Override
        public void handleMessage(Message msg) {
            
        }
    }

另一种情况:

不规范的写法:

private Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
 
        };
    };

正确的写法:

private Handler mHandler = new Handler(new Handler.Callback() {
        @Override
        public boolean handleMessage(Message msg) {
            return false;
        }
    });

4、@SuppressLint(“SimpleDateFormat”)

不规范写法:SimpleDateFormat format = new SimpleDateFormat(pattern);

正确写法:SimpleDateFormat format = new SimpleDateFormat(pattern, Locale.getDefault());

5、@SuppressLint(“DefaultLocale”)

不规范写法:String lower = string.toLowerCase();

boolean b = “String”.toUpperCase().equals(“STRING”);

正确写法:String lower = string.toLowerCase(Locale.getDefault());

boolean b = “String”.toUpperCase().equals(“STRING”);


目录
相关文章
|
7月前
|
XML Java Android开发
Android Studio App开发之翻页视图ViewPager的讲解及实战(附源码 包括翻页视图和翻页标签栏)
Android Studio App开发之翻页视图ViewPager的讲解及实战(附源码 包括翻页视图和翻页标签栏)
898 0
RecyclerView禁止复用
RecyclerView禁止复用
1750 0
|
5月前
|
Java Android开发
android 设置系统时间的流程
android 设置系统时间的方法
372 2
|
7月前
|
Android开发
Android studio 2021.3.1不生成iml文件
Android studio 2021.3.1不生成iml文件
280 5
|
物联网 测试技术 Android开发
蓝牙BLE传输性能及延迟分析
BLE传输性能主要受以下几个因素影响:操作类型,Connection Interval,每个Connection Event内发送的帧数、每一帧数据的长度。具体参见如下链接: https://en.wikipedia.
3737 0
|
Android开发
IDEA编译gradle提示This version of the Android Support plugin for IntelliJ IDEA (or Android Studio) cannot open this project, please retry with version 2020.3.1 or newer.
IDEA编译gradle提示This version of the Android Support plugin for IntelliJ IDEA (or Android Studio) cannot open this project, please retry with version 2020.3.1 or newer.
896 1
|
7月前
|
Rust Java 开发者
5月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区5月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
2229 150
|
3月前
|
Oracle Java iOS开发
JDK的选型、安装与配置
JDK的选型、安装与配置
133 1
|
7月前
|
API 开发工具 Android开发
调用Android原生@SystemApi、@Hide方法
调用Android原生@SystemApi、@Hide方法
602 1