一起学Android之Handler
概述
在Android开发中,有主线程(UI线程)和工作线程(Worker线程)之分,两个线程是相互独立的,并不能相互访问(主线程主要负责UI的更新,不能进行耗时的操作,工作线程主要负责耗时的操作,但不能进行UI的更新),所以要在两个线程之间进行数据传递,就需要Handler作为传递数据的桥梁。每一个Handler对象,都与独立的线程以及线程的消息队列有关。本文仅供学习分享使用。
Handler逻辑
- Looper会从消息队列中,将消息对象取出。
- Looper会找到Message对象对应的Handler对象。
- Looper会调用Handler对象的handleMessage方法,用于处理对象。
涉及知识点
- Android线程:有主线程(UI线程)和工作线程(Worker线程)
- Handler 允许发送和处理与线程相关的消息对列的可运行对象。
- handleMessage (Message msg) 必须在子类进行重写的的处理消息的方法。
- sendMessage (Message msg) 发送消息方法。
- obtainMessage () 用于从全局消息池中获取一个新的对象。
- Message 定义一个用于描述和任意数据对象的消息,此消息可以发送到Handler对象。
- what 消息对象的标识符。
- arg1,arg2 用于存储整型数据的值。
- obj 可以接受任意的对象,用于存储消息的对象的值。
- Thread 线程是一个可并发执行的单元。重写run方法来处理线程内容。
Handler原理
如下图所示:

核心代码
创建一个内部类继承Handler
/*
创建一个内部Handler类
*/
class NetworkHandler extends Handler{ @Override
public void handleMessage(Message msg) {
Log.i("DemoHandler", "run: thread id2="+Thread.currentThread().getName());
String s = (String) msg.obj;
txtInfo.setText(s);
}
}
创建一个内部类,继承Thread
/*
创建一个线程内部类
*/
class NetworkThread extends Thread{
@Override
public void run() {
Log.i("DemoHandler", "run: thread id1="+Thread.currentThread().getName());
//模拟网络获取,当执行时休眠2秒钟
try {
Thread.sleep(2*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//通过handler将线程数据,发送到消息队列中
//1. Looper将消息队列中的消息对象取出。
//2. Looper找到消息对象对应的Handler对象
//3. Looper将会调用handler对象中的handleMessage(Msg)方法,处理对象
String s="这是一个线程中的数据";
Message msg=handler.obtainMessage();
msg.what=1;
msg.obj=s;
handler.sendMessage(msg);
}
}
启动线程
public void click_me(View v){
//点击事件中启动一个线程
Thread thread=new NetworkThread();
thread.start();
}
调试输出信息(两个分属不同的线程)
04-25 22:56:37.424 18601-18786/com.hex.demohandler I/DemoHandler: run: thread id1=Thread-4
04-25 22:56:39.425 18601-18601/com.hex.demohandler I/DemoHandler: run: thread id2=main
04-25 22:56:55.491 18601-18800/com.hex.demohandler I/DemoHandler: run: thread id1=Thread-5
04-25 22:56:57.492 18601-18601/com.hex.demohandler I/DemoHandler: run: thread id2=main
备注
大多数情况下,在worker thread中修改view是不可以的,小部分是可以的,如progressbar 。
一起学Android之Handler的更多相关文章
- Android精通之Handler讲解
版权声明:未经博主允许不得转载 一:简介 [达叔有道]软件技术人员,时代作者,从 Android 到全栈之路,我相信你也可以!阅读他的文章,会上瘾!You and me, we are family ...
- 一步一步学android控件(之六) —— MultiAutoCompleteTextView
今天学习的控件是MultiAutoCompleteTextView . 提到MultiAutoCompleteTextView 我们就自然而然地想到AutoCompleteTextView ,就想知道 ...
- Android的Handler机制
Handler机制的原理 Android 的 Handler 机制(也有人叫消息机制)目的是为了跨线程通信,也就是多线程通信.之所以需 要跨线程通信是因为在 Android 中主线程通常只负责 UI ...
- Android开发学习之路-该怎么学Android(Service和Activity通信为例)
在大部分地方,比如书本或者学校和培训机构,教学Android的方式都基本类似,就是告诉先上原理方法,然后对着代码讲一下. 但是,这往往不是一个很好的方法,为什么? ① 学生要掌握这个方法的用途,只能通 ...
- 菜鸟学Android编程——简单计算器《一》
菜鸟瞎搞,高手莫进 本人菜鸟一枚,最近在学Android编程,网上看了一些视频教程,于是想着平时手机上的计算器应该很简单,自己何不尝试着做一个呢? 于是就冒冒失失的开撸了. 简单计算器嘛,功能当然很少 ...
- 学Android开发,入门语言java知识点
学Android开发,入门语言java知识点 Android是一种以Linux为基础的开源码操作系统,主要使用于便携设备,而linux是用c语言和少量汇编语言写成的,如果你想研究Android,就去学 ...
- Android 测试Handler的基本使用
package com.sherlock.app_handler; import java.io.ByteArrayOutputStream; import java.io.InputStream; ...
- Android中Handler 、Thread和Runnable之间的关系
在多线程编程的时候,我们经常会用到Handler,Thread和Runnable这三个类,我们来看看这三个类之间是怎么样的关系? 首先说明Android的CPU分配的最小单元是线程,Handler一般 ...
- Android之Handler,举例说明如何更新UI
方法一:(java习惯,在android不推荐使用) 刚刚开始接触android线程编程的时候,习惯好像java一样,试图用下面的代码解决问题 new Thread( new Runnable() { ...
随机推荐
- 线程中put(None)和主函数中put(None)的区别和用法
''' 初试生产者消费者模型代码 分析: 对象含有生产者.队列.消费者 Queue队列模块,不适合传大文件,通常传一些消息. ''' '''多生产者进程和多消费者进程''' #导入模块 from mu ...
- 花生日记_花生日记APP下载_花生日记官方网站
花生日记 国内领先的社交电商导购分享平台. 独创社交电商3+模式,社交+电商+社群,上线1个月注册用户超百万.合作商家涵括各个类目以及平台.为数万宝妈提供月收入3000以上兼职收入. 微信扫描下方二维 ...
- python基础知识第三篇(列表)
列表 list 类 中提供的方法 li=[1,5,dhud,dd,] 通过list类创建的对象 中括号括起来 逗号分隔每个元素 列表中的元素可以是数字,字符串,也可以是列表,也可以是布尔值 所有的都能 ...
- 高版本Visual Studio和低版本ArcGIS共存 工具箱没有控件的解决方法
转载请声明.博客园/B站/CSDN/知乎/小专栏 @秋意正寒 欢迎访问小专栏,更多WebGIS开发(Cesium等)经验分享:https://xiaozhuanlan.com/gishome 众所周知 ...
- docker 使用mysqldump命令备份导出项目中的mysql数据
下图为镜像重命名后的镜像名为uoj,现在要把这个镜像中的mysql导出 运行如下命令: docker exec -it uoj mysqldump -uroot -proot app_uoj233 & ...
- docker拉取慢(net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting head)
systemctl restart docker在docker-hub拉取慢,因为服务器在外网 直接配置阿里云镜像就可以 首先: vim /etc/docker/daemon.json加入下面的那句 ...
- 关于Xpath
1.xPath简介 XPath是一门在XML和HTML文档中查找信息的语言,可以用来在XML和HTML文档中对元素和属性进行遍历 XPath的安装 Chrome插件XPath Helper 点Chro ...
- webpack入门——构建简易版vue-cli
前言:(面试让介绍webpack,你可以这么答)简单地说,Webpack其最核心的功能就是 解决模板之间的依赖,把各个模块按照特定的规则和顺序组织在一起,最终合并成一个JS文件(比如bun ...
- OD 快捷方式及窗口说明
OD 快捷方式 其他窗口 L : log 保存日志信息 E :程序的所有模块的信息(加载基址,大小,OEP,路径) M :程序的内存映射视图 T :线程信息 W :窗口信息 H :句柄表 C :CPU ...
- Redis 数据淘汰机制
为了更好的利用内存,使Redis存储的都是缓存的热点数据,Redis设计了相应的内存淘汰机制(也叫做缓存淘汰机制) 通过maxmemory 配置项来设置允许用户使用的最大内存大小,当内存数据集大小达到 ...