Android性能优化之handler的正确使用与解析
发布日期:2021-06-30 20:37:34
浏览次数:2
分类:技术文章
本文共 1508 字,大约阅读时间需要 5 分钟。
1.什么是Handler
是Android消息机制的上层接口,是一种更新ui的机制。
(Android是线程不安全的,所以能在子线程更新ui,只能执行耗时操作 ,所以要通过handler发送消息更新)2.Handler实现原理
ThreadLocal:通过不同的线程访问同一个ThreadLocal,无论是ThreadLocal的get或set方法,它们对ThreadLocal的读写操作都仅限于各自线程内部。 通过ThreadLocal保存Looper(保证handler中的每个Looper是相互独立的,且不同的线程访问不同的Looper) Looper是内部管理MessgeQueue的。每一个handler要与主线程关联上,才可以更新ui。不能在内部类创建handler。这样才能保证ui线程是线程安全。
(就小小的借鉴一下另一位博主的图展示一下handler的流程,个人觉得还是蛮好的)
3.Handler内存泄露问题
产生内存泄露原因:静态内部类持有外部类的匿名使用,导致在用户退出当前Activity时,handler内部的一些耗时操作还在运行,从而导致activity还被handler做引用,最终导致activity还存留在堆栈中,没有被回收,导致内存泄露。 解决:1.handler内部持有外部activity的弱引用。 2.把handler改为静态内部类。 3.在activity的onDestory方法内掉用mHandler.removeCallBack()。(只能90%的解决)
解决实例:
/** * 解决方式 * * 要解决这种问题,思路就是不适用非静态内部类,继承Handler时,要么是放在单独的类文件中,要么就是使用静态内部类。 * 因为静态的内部类不会持有外部类的引用,所以不会导致外部类实例的内存泄露。 * 当你需要在静态内部类中调用外部的Activity时,我们可以使用弱引用来处理。 * 另外关于同样也需要将Runnable设置为静态的成员属性。 * 注意:一个静态的匿名内部类实例不会持有外部类的引用。 */private MyHandler mMyHandler = new MyHandler(this);private static class MyHandler extends Handler{ // SoftReference也可以使用软应用 只有在内存不足的时候才会被回收 private final WeakReference mActivity; private MyHandler(Activity activity) { mActivity = new WeakReference<>(activity); } @Override public void handleMessage(Message msg) { Activity activity = mActivity.get(); if (activity != null){ //做操作 } super.handleMessage(msg); }}private static final Runnable sRunnable = new Runnable() { @Override public void run() { //做操作 }};
感觉还不错的,点个赞呗
转载地址:https://liuqiang.blog.csdn.net/article/details/79942973 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月20日 21时20分52秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Ubuntu20.04安装微信
2019-04-30
Restful风格的使用
2019-04-30
Swagger基础入门整合SpringBoot
2019-04-30
MyBatisPlus简单入门(SpringBoot)
2019-04-30
攻防世界web进阶区NewsCenter详解
2019-04-30
攻防世界web进阶PHP2详解
2019-04-30
如何解决词达人问题(新)
2019-04-30
攻防世界web进阶区easytornado详解
2019-04-30
攻防世界web进阶区web2详解
2019-04-30
xss-labs详解(上)1-10
2019-04-30
xss-labs详解(下)11-20
2019-04-30
攻防世界web进阶区ics-05详解
2019-04-30
攻防世界web进阶区FlatScience详解
2019-04-30
攻防世界web进阶区ics-04详解
2019-04-30
攻防世界web进阶区Cat详解
2019-04-30
攻防世界web进阶区bug详解
2019-04-30
攻防世界web进阶区ics-07详解
2019-04-30
攻防世界web进阶区unfinish详解
2019-04-30
攻防世界web进阶区i-got-id-200超详解
2019-04-30
sql注入总结学习
2019-04-30