有那些方法加入到主UI线程中运行

1.Activity.runonUiThread(Runnable)

2.View.post(Runnable); View.postDelay(Runnable,long)

3.Handler

4.AsyncTask

Handler的作用

1.执行计划任务,你可以在预定的实现执行某些任务,可以模拟定时器

2.线程间通信。在Android的通信启动时,会创建一个主线程,主线程会创建一个消息队列来处理各种消息。当你创建子线程时,你可以在你的子线程中拿到父线程中创建的Handler对象,就可以通过该对象向父线程的消息队列发送消息了。由于Android要求在UI线程中更新界面,因此,可以通过该方法在其他线程中更新界面。



3)确保操作始终在某个特定的线程中运行。例如当我们从数据库加载数据时,除了程序启动时需要加载外,每当我们接收数据改变时也需要重新加载。为了确保数据的有效性(始终使用最后一次查询得到的数据),并减小不必要的查询操作,我们应当确保他们在同一个线程中运行。

角色描述

1.Looper:(相当于隧道) 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(车队,消息隧道)

2.Handler:你可以构造Handler对象来与Looper沟通

3.Message Queue(消息队列):用来存放线程放入的消息

4.线程:UI thread通常是main thread,而Android启动程序时会替它建立一个Message Queue


Looper的实现:


当前线程有一个Looper这样的循环在监听消息队列,这是一个死循环,主线程好像可以不用管Looper,其他逻辑代码可以照常往下走,但这个又不是而外的线程,这不是和我们学习的常理相悖么?
Looper由系统控制的循环。在我们的线程没有新开,但是在系统里面vm会有


其实Looper的实现和Windows编程的消息机制非常相似

对于正在执行的Message,调用removeMessage会有什么后果?

1.调用removeMessage移除一个还没有开始执行的message,看看会有什么效果?

那么这个message就不会执行了

2.移除一个正在执行的message,观察有什么效果

这个message如果被处理了,移除就没有效果了


Handler其实很简单

1.Handler实例与消息处理是关联的,发送和接收要匹配

2.只能依附在HandlerThread

3.可以通过设置Looper来选择依附的线程

4.所有的操作都是在同一个线程中

5.removeMessage只能移除队列中的Message

6.如果只通过Handler.post()方法将线程压入队列时,直接调用的是线程的run()方法,则主线程和调用的线程处于

同一个线程中。


同一个HandlerThread可以有多个Handler么? Yes

同一个HandlerThread中使用多个Handler Message会混淆么? 为什么?

No 每一条消息都有一个target字段,这个target字段就标识了是哪个handler



考核目标

1.使用Handler是异步的,它会建立新线程吗?

No 依附在线程的Looper中

2.Handler是在主线程内?

不一定 可以通过Looper选择依附的线程

3.Handler的post和sendMessage方法,使用的是一个队列还是两个

1个

4.子线程建立一个Handler,然后sendMessage会怎样

报错

5.Handler中不同的消息有可能被同时处理吗?

不可能 因为他们运行在同一个线程中

6.当Handler在处理消息时,如果收到removeMessage(),会中断这个处理么?

不会

更多相关文章

  1. Android(安卓)4.2短信发送流程小记
  2. Android(安卓)RIL源码研究笔记 の ril_event
  3. Android面试复习资料整理
  4. 关于ANDROID下载与音乐播放
  5. Android线程—HandlerThread的使用及原理
  6. Android(安卓)ActivityThread(主线程或UI线程)简介
  7. 探究Android(安卓)SQLite3多线程
  8. 9、四大组件之四-Broadcast Receiver
  9. android 中如何监听耳机键消息

随机推荐

  1. 0202面向对象编程基础
  2. beego项目和go项目 打包部署到linux
  3. 2021.2.3
  4. 接口和抽象类的实现-区别与联系
  5. 类声明与实例化、类的静态成员与类的扩展
  6. 面向对象编程基础
  7. 接口和抽象类
  8. 面向对象封装,继承,加载器
  9. CentOS 6.5 用光盘镜像制作本地yum源
  10. php常量知识点的总结及过滤器的使用(1118