@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”);


目录
相关文章
|
8月前
|
XML Java Android开发
Android Studio App开发之翻页视图ViewPager的讲解及实战(附源码 包括翻页视图和翻页标签栏)
Android Studio App开发之翻页视图ViewPager的讲解及实战(附源码 包括翻页视图和翻页标签栏)
1006 0
RecyclerView禁止复用
RecyclerView禁止复用
1796 0
|
6月前
|
Java Android开发
android 设置系统时间的流程
android 设置系统时间的方法
455 2
|
物联网 测试技术 Android开发
蓝牙BLE传输性能及延迟分析
BLE传输性能主要受以下几个因素影响:操作类型,Connection Interval,每个Connection Event内发送的帧数、每一帧数据的长度。具体参见如下链接: https://en.wikipedia.
3773 0
|
7月前
|
存储 缓存 数据库
Android之SQLite数据库使用详解
Android之SQLite数据库使用详解
|
8月前
|
Android开发
Android studio 2021.3.1不生成iml文件
Android studio 2021.3.1不生成iml文件
296 5
|
8月前
|
Rust Java 开发者
5月更文挑战赛火热启动,坚持热爱坚持创作!
开发者社区5月更文挑战,寻找热爱技术内容创作的你,欢迎来创作!
2340 151
|
7月前
|
Android开发
如何 将Android Studio升级至最新版(4.0)
如何 将Android Studio升级至最新版(4.0)
1079 0
|
8月前
|
存储 缓存 安全
阿里云EMR数据湖文件系统: 面向开源和云打造下一代 HDFS
本文作者详细地介绍了阿里云EMR数据湖文件系统JindoFS的起源、发展迭代以及性能。
72768 79