当前位置: 首页 > news >正文

提供手机自适应网站建设维护网站建设公司找哪家

提供手机自适应网站建设维护,网站建设公司找哪家,推荐一些能打开的网站,怎么看网站关键词排名一、Handler运行原理剖析 1.关系剖析图 如果把整个Handler交互看做一个工厂,Thread就是动力MessageQueue是履带Looper是转轴Loooper的loop方法就是开关,当调用loop方法时整个工厂开始循环工作,处理来自send和post提交到MessageQueue的消息&a…

一、Handler运行原理剖析

1.关系剖析图

如果把整个Handler交互看做一个工厂,Thread就是动力MessageQueue是履带Looper是转轴Loooper的loop方法就是开关,当调用loop方法时整个工厂开始循环工作,处理来自send和post提交到MessageQueue的消息,每处理完一个后由Handler的dispatch分发出去

2.代码走向剖析图

以上代码走向图无论send还是post,最终都是通过Handler的enqueueMessage方法将消息放到MessageQueue中,线程调用loop方法后循环从MessageQueue的next方法中获取消息并进行处理,每处理完一个后由Handler的dispatchMessage分发再通过handleMessage方法回调出去

二、Handler常见问题解答


1.一个线程可以有多少Handler?


无数个,因为在任何地方都可以直接new

2.一个线程可以有几个Looper?你如何保证只有那么多个?


一个,因为源码中已经做了这种判断,在线程被创建时源码中会通过ThreadLocal进行线程与Looper的绑定,通过一个Object[]使前者为key后者为value依次向后,当我们在调用Looper的prepare方法去创建其时,源码中会去调用ThreadLocal的get去判断,如存在抛出异常,不存在则调用set进行创建绑定;如果是主线程,则源码已经在ActivityThread的main方法中为我们创建好了,所以我们可以直接在主线程中new和使用,子线程中却需要调用prepare和loop进行使用

3.Handler为什么会发生内存泄漏?为什么其他的内部类没有这个问题?


因为Java虚拟机中内部类默认持有外部类的引用,当Activity如果在无感知的情况下被销毁时,Handler如果还在执行某些耗时操作时,所以就会产生内存泄漏;这跟Handler的原理有关,因为源码中消息池每一个Message都持有一个target(Handler)对象,而这个target(Handler)对象都持有外部类的引用如Activity,所以其他内部类没有这个问题
拓展:可以通过static+weak reference或Handler的remove对应方法解决

4.为何主线程可以直接new Handler?如果子线程想要new Handler需要做些什么?


因为主线程在ActivityThread的main方法中已经创建了Looper,所以主线程使用Handler时可以直接new;子线程使用Handler时需要调用Looper的prepare和loop方法才能进行使用,否则会抛出异常

5.如果子线程中需要维护一个Looper,当消息队列中没有消息时会发生什么问题?怎么解决?这样解决有什么作用?


当子线程run方法体的业务逻辑执行完时会走到loop处,导致子线程死锁;可以通过调用Looper提供的quitSafely方法,最终调用MessageQueue的quit方法,传一个true即可,如false则抛出异常,感兴趣的小伙伴可以去看看源码,提示主线程不允许退出;作用是移除所有没有处理的消息然后唤醒native锁并且释放资源

6.如果存在多个Handler往MessageQueue中添加数据,因为发送消息时各个Handler可能处于不同的线程,那源码内部是如何实现线程安全的?


因为在源码中可以发现MessageQueue的enqueueMessage方法在将消息推入时将入了同步代码块,在next去消息时也加入了同步代码块,所以保证了Handler消息的通讯是线程安全的

7.我们使用Message时应该怎么样去创建它更合理?


使用obtain去创建Message最合理

8.使用Handler的postDelay等延时方法后消息队列会有什么变化?


会根据delay时间去进行一个时间排序,通过遍历单链表把delay消息插入到合适的位置,然后通过nativePollOnce进行休眠,如有新消息进入则调用nativeWake唤醒,然后再计算时间差进行休眠,直到msg.when >= now为止

9.Looper死循环为什么不会导致应用卡死?


loop循环的取出消息并分发,无消息时会阻塞在next()方法中nativePollOnce()代码行,并释放CPU资源进入休眠,Android的绝大部分操作都是通过Handler机制来完成的,如果没有消息,则不需要程序去响应,就不会发生卡死。应用卡死指的是ANR一般是消息处理过程中耗时太长导致没有及时响应用户的操作

10.源码中是如何对Message做优化的?使用的是什么Java设计模式?


源码中对Message进行了池化策略的优化,避免过多的创建Message对象;享元模式

        

http://www.yayakq.cn/news/985314/

相关文章:

  • 哇哈哈网站建设策划书asp网站怎样做app
  • 彩票的网站怎么做大连旅顺旅游攻略
  • 怎样编辑网站标题深圳有几个区县
  • 深圳网站品牌推广新手小白怎么做跨境电商
  • 深圳做网站网络营销公司排名网络维护人员是做什么的
  • 周浦网络网站建设公司邢台做网站动态
  • 青岛西海岸新区建设网站iis7.0配置网站
  • 线上网站开发相关书籍企业推广的主要目的是
  • 网站建设模块怎么使用wordpress next
  • 电子政务网站建设的特点长春市建设集团股份有限公司
  • 哈尔滨建设信息网站佛山seo优化评价
  • 东莞模板网站设计打开网站图片弹入指定位置代码
  • 绵阳 网站 建设邯郸信息港发布信息
  • 创建网站的目的是什么青海省建设监理协会网站
  • 网站制作北京海淀六安新闻
  • 网批做衣服的网站网页制作与网站建设英文翻译
  • 有哪些网站可以接单做效果图深圳网站建设燦
  • 如何做外贸营销型网站网站登录按纽是灰色的
  • 网站备案 信息查询做购物网站的数据库
  • 网站怎样在360做优化2023年又封城了
  • 查询网站哪做的兰州网站排名分析
  • 翻书效果的网站网站开放培训
  • 绿色环保材料网站模板万能软文模板
  • 网站建设与管理的考试搜索引擎在线观看
  • 怎么做好网站营销北京seo网站诊断
  • 网站开发商标属于哪一类河南省新闻出版学校咋样
  • 定制开发电商网站建设哪家好网站常用代码
  • 定制开发网站做gif网站
  • 南宁哪家公司建设网站比较好网站源码建站视频
  • 长沙行业网站建设网站建设和管理的总结怎么写