文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

总结--3

2023-01-31 01:06

关注

主线程创建的时候会默认创建Looper、HandlerThread则是内置Looper,除此之外其他的线程创建时是不会创建Looper的,需手动创健线程自己的Looper。

子线程更新主线程创建的控件引发的错误:Only the original thread that created a view hierarchy can touch its views

默认情况下Handler会与其被定义时所在线程的Looper绑定,比如,在主线程中定义,其是与主线程的Looper绑定。

HandlerThread实际上就是一个Thread,只不过它比普通的Thread多了一个Looper。Looper 和MessageQueue的关系:MessageQueue是Looper类的成员变量。主线程被创建之后会默认创建Looper,这个Looper是属于主线程的,他会为主线程创建MessageQueue消息循环队列。

看具体代码分析:

wKiom1Nw4DLTdlnGAAGoyJar7Xk458.jpg

这段代码会报错,会提示说子线程不能更新主线程的控件,为什么?


wKiom1Nw4MHRVNYeAABt5kpwY6c857.jpg

首先创建名字叫“MyHandlerThread”的线程,这个阶段同时也为这个线程默认创建了Looper(消息循环器)、和MessageQueue(消息队列)。

wKiom1Nw4SrjmBZJAAAxxoLctfM364.jpg

表示将Handler绑定到线程“MyHandlerThread”的Looper,让Handler专门来处理Looper的消息


wKiom1Nw4VWztcldAAEX9KdUyT4378.jpg

将实现Runnable的对象,作为Message对象传给线程“MyHandlerThread”的MessageQueue,当线程“MyHandlerThread”的Looper拿出这个消息的时候,发现这个消息是实现Runnable接口的类的对象,于是就会去掉用回调函数run(),其实就是把回调函数的代码拿到线程“MyHandlerThread”里来执行。

如果创建一个子线程,你希望自己的子线程能够有自己的Looper、Handler、MessageQueue你有两种方法,一种是像之前创建线程一样,但要在重写的run{}方法里,为线程创建Looper,这种方法比较麻烦,可以直接使用HandlerThread,没必要在重写run{},因为HandlerThread的run()方法其中涉及到Looper的创建和启动,Looper.loop()一执行就会进入死循环,就算你重写HandlerThread的run()也没用,那里的代码没机会被执行,因为此时正在执行Looper.loop()这个死循环。

继承Thread重写run()没有调用super.run(),HandlerThread重写时就有:

Spuer.run()系统自己自动加的,HandlerThread和Thread不大一样,他有自己的Looper,而HandlerThread的run()方法就是来创建Looper的,系统要确保这个函数会被执行,所以要在覆盖他的函数里添加super.run()来调用HandlerThread的run()方法。

为什么在子线程内部创建Handler会报错:那是因为子线程没有Looper,你可以不要将Handler对象放在子线程,可以放在主线程,因为主线程的Looper是默认创建的,这样借用主线程的Handler和Looper来处理消息。或者你也可以为子线程创建Looper,这样子线程就有一套自己的Looper、MessageQueue、Handler,就可以来在子线程内处理消息,创建子线程的Looper:  Looper  looper  = Looper.myLooper ( );


阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯