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


目录
相关文章
|
移动开发 开发框架 JavaScript
uniapp如何与原生应用进行混合开发?
uniapp如何与原生应用进行混合开发?
1331 0
|
安全 Linux 数据处理
对android下的ptrace详细分析
解析ptrace函数的功能
824 0
|
Android开发 开发者
 一键在线获取APP公钥、包名、签名及备案信息方法介绍
本文介绍了一款在线APP解析工具,可以一键获取APP的公钥、包名、签名等基础信息,同时提供了详细的操作步骤和使用示例,帮助开发者更便捷地进行APP备案信息的获取。
|
Linux Shell API
ollama 大模型部署 工具 | AIGC
Ollama是一个集成了多种大型语言模型的工具,它支持模型的部署、运行以及API的整合和调用。Ollama为不同操作系统的用户提供了便捷的安装方式,并具备丰富的命令行界面(CLI)和API接口,使得用户可以轻松地管理和运行大型模型。【10月更文挑战第1天】
1773 1
Vue3日期选择器(DatePicker)
该组件基于 **@vuepic/vue-datepicker@9.0.1** 进行二次封装,简化了日常使用。除范围和年选择器外,其他日期选择均返回格式化的字符串。提供了多种自定义设置,如日期选择器宽度、模式、格式等,并支持时间选择和“今天”按钮展示。详细配置及更多功能请参考[官方文档](https://vue3datepicker.com/installation/)。组件已集成所有原生属性,并支持主题颜色自定义。 示例代码展示了如何创建和使用日期选择器组件,包括基本使用、禁用日期、日期时间选择器、范围选择器等多种场景。更多功能和样式可通过官方文档了解。
2667 2
Vue3日期选择器(DatePicker)
|
Android开发
Android studio 出现Plugin [id: ‘com.android.application‘, version: ‘8.1.0‘, apply: false] 问题解决办法
Android studio 出现Plugin [id: ‘com.android.application‘, version: ‘8.1.0‘, apply: false] 问题解决办法
6031 2
|
API Android开发
Android Framework增加API 报错 Missing nullability on parameter
Android Framework增加API 报错 Missing nullability on parameter
713 1
|
Rust 算法 数据安全/隐私保护
【密码学】一文读懂白盒AES(Chow方案)(二)
本文主要参考了文献^[1], 代码参考了^[2], 这里感谢文献作者和代码作者,如果有能力的大佬,可以自行查看原文献,个人水平有限,有哪里写的不对的地方,也欢迎读者指正。
2125 0
【密码学】一文读懂白盒AES(Chow方案)(二)
|
Android开发
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。
Android修改默认system/bin/下可执行程序拥有者和权限,使用实例,只有root和系统app权限才能执行某个命令。 【5月更文挑战第2天】
838 0