我的编程空间,编程开发者的网络收藏夹
学习永远不晚

总结--3

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

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

总结--3

主线程创建的时候会默认创建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 ( );


总结--3

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

总结--3

主线程创建的时候会默认创建Looper、HandlerThread则是内置Looper,除此之外其他的线程创建时是不会创建Looper的,需手动创健线程自己的Looper。子线程更新主线程创建的控件引发的错误:Only the origin
2023-01-31

MySQL总结-3

1、连接 mysql -u username -ppassword -P 3306 -D database -hip2、列显示:"\G"mysql> select * from HUMMOCK_BLACK_LIST limit 1 \G; 
2023-01-31

python 学习总结3

Python蟒蛇绘制一、实现程序如下 1 import turtle 2 turtle.setup (650, 350, 200, 200)#turtle的绘图窗体turtle.setup(width, height, startx, st
2023-01-30

IPSec ×××配置总结 3

1.      用路由器实现站点到站点的EZ×××EZ×××有的也写作Easy ×××,顾名思义就是容易使用的×××。它是Cisco开发的用于简化远程端配置和管理的一种基于IPSec ×××的实现,降低了×××在实施过程中的复杂程度。EZ×
2023-01-31

ExtJS样例总结 -3

http://tianya23.blog.51cto.com/1081650/813863http://tianya23.blog.51cto.com/1081650/8216491、Ajax标准请求:Ext.Ajax.request({ 
2023-01-31

BGP学习 总结3

BGP DECISION PROCESS1 largest weight ( local orininated path :32768 other 0 )2 largest local-preefernce (BGP default loc
2023-01-31

AIX 5L学习总结3

1.-bash-3.00$ prtconf | more //查看配置信息可以看到大部分配置信息。-bash-3.00$ prtconf | moreSystem Model: IBM,9110-51AMachine Serial Numb
2023-01-31

java面试大总结(3)

101、java中会存在内存泄漏吗,请简单描述。会。如:int i,i2;  return (i-i2);   //when i为足够大的正数,i2为足够大的负数。结果会造成溢位,导致错误。 102、java中实现多态的机制是什么?方法的重
2023-01-31

Kubernetes 学习总结(3) M

APIserver符合RESTful风格,支持GET/PUT/DELETE/POST等各种操作。所以也支持kubectl通过一系列命令对各处资源进行管理控制。常用的资源1)、workLoad(工作负载型资源,运行APP,对外提供服务): P
2023-01-31

jdbc学习总结3------javab

1.测试类的内容:在包:com.hanchao.test中 package com.hanchao.test;  import com.hanchao.dao.UserDao; import com.hanchao.entity.User;
2023-01-31

2020年3月Android面试总结:

前言: 由于新冠状病毒隔离的原因 去年离职到现在一直没有办法找工作 在深圳呆了一个多月了 java基础也复习了一遍 总体来说还是有些收获! 在3月初正式复工以来 公布简历后有很多外包公司打招呼! 因为自己对外包公司印象不好所以拒
2022-06-06

Java 多线程学习总结3

在上一篇中,我们当然希望a++,b++执行完之后,show方法再来show.我们需要的是“原子”动作,一次性地把a++,b++不间断地执行。在java中是利用“互斥”的方法,互斥谁呢?互斥的是相同对象的加锁代码。如果我们把第一篇的SomeB
2023-01-31

将近3个月的实习总结

这篇文章应该写的更早写,但是一直忙学校的论文,其实这个也是借口,如果想要做什么事,怎么都会有时间的。     ......     将近3个多月的实习,发现收获最多的一天就是最后一天,准备离开的时候和鹏叔在外面聊天,然后 突然感觉自己的实习
2023-01-31

Android View移动的3种方式总结

前言 在Android开发中,View一直是Android开发人员的一块心病,一方面想要进阶,一方面又害怕进阶,可以说Android的View是进阶路上的最大绊脚石,因为它涉及的东西太多了,比如本次我们此次要写的View移动,另外还包括Vi
2022-06-06

SQL Server时间转换3种方法总结

目录第一种:format第二种:CONVERT第三种:DATEADD()总结 第一种:format--转化成年月日select format( GETDATE(),'yyyy-MM-dd')--转化年月日,时分秒,这里的HH指24小时
SQL Server时间转换3种方法总结
2024-09-19

Uniapp接入插件的3种方式总结

我们在做uniapp的项目的时候经常需要用到各种插件,下面这篇文章主要给大家介绍了关于Uniapp接入插件的3种方式的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-05-19

node连接MySQL数据库的3种方式总结

现在前端基本上都会用一些NodeJs,想必也想自己写一些API或者个人博客的后台系统,这些就离不开连接数据库的问题,下面这篇文章主要给大家介绍了关于node连接MySQL数据库的3种方式,需要的朋友可以参考下
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录