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


目录
相关文章
|
3月前
|
人工智能 JavaScript Linux
【最新版养 AI龙虾🦞指南】零基础 OpenClaw 阿里云/本地部署、配置、使用保姆级教程
OpenClaw(原Clawdbot,曾用名Moltbot)作为一款开源轻量级AI自动化代理工具,2026年版本在部署灵活性、功能兼容性上实现重大升级,核心优势在于“自然语言驱动+全流程任务自动化”,无需手动编写脚本,仅需输入口语化指令,即可完成文档处理、日程管理、文件读写、跨工具协同、代码生成等各类重复性工作,被广泛应用于个人办公、新手开发、轻量团队协作等场景,堪称“私人AI员工”。
1594 92
SQL 个版本下载地址
备用:   SQL Server 2016简体中文企业版 文件名:cn_sql_server_2016_enterprise_x64_dvd_8699450.iso 64位下载地址:ed2k://|file|cn_sql_server_2016_enterprise_x64_dvd_8699450.
3077 0
|
2月前
|
人工智能 运维 Serverless
从0到1:3分钟搭建你的第一个企业级AI Agent实战指南
本文分享如何用阿里云函数计算AgentRun,零运维、低成本地从零搭建企业级AI Agent:支持模板开箱即用、高代码自定义、多Agent协同,并已落地吉利、森马等真实场景。(239字)
1544 0
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
626 0
基于DSP的数字滤波器设计
基于DSP的数字滤波器设计
611 4
|
缓存 算法 Java
Linux内核新特性年终大盘点-安卓杀后台现象减少的背后功臣MGLRU算法简介
MGLRU是一种新型内存管理算法,它的出现是为了弥补传统LRU(Least Recently Used)和LFU(Least Frequently Used)算法在缓存替换选择上的不足,LRU和LFU的共同缺点就是在做内存页面替换时,只考虑内存页面在最近一段时间内被访问的次数和最后一次的访问时间,但是一个页面的最近访问次数少或者最近一次的访问时间较早,可能仅仅是因为这个内存页面新近才被创建,属于刚刚完成初始化的年代代页面,它的频繁访问往往会出现在初始化之后的一段时间里,那么这时候就把这种年轻代的页面迁移出去
|
存储 Android开发
android Jetpack—ViewModel使用方法和详细原理解析
android Jetpack—ViewModel使用方法和详细原理解析
1479 0
android Jetpack—ViewModel使用方法和详细原理解析
WK
|
机器学习/深度学习 Java 程序员
为什么Python比C++慢很多?
Python相较于C++较慢主要体现在:动态类型系统导致运行时需解析类型,增加开销;作为解释型语言,逐行转换字节码的过程延长了执行时间;自动内存管理和垃圾回收机制虽简化操作但也带来了额外负担;全局解释器锁(GIL)限制了多线程性能;尽管Python库方便灵活,但在性能上往往不及C++底层库。然而,Python在某些领域如数据分析、机器学习中,凭借其高级别抽象和简洁语法仍表现出色。选语言需依据具体应用场景和需求综合考量。
WK
923 1
|
API Android开发
Android Framework增加API 报错 Missing nullability on parameter
Android Framework增加API 报错 Missing nullability on parameter
904 1