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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Android性能优化之导致内存泄露问题的原因
下一篇:Android性能优化之webView的正确使用

发表评论

最新留言

路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月20日 21时20分52秒