05_消息机制与异步任务

1.理论概述

说明

  • 在Android中,只有在UIThread中才能直接更新界面

  • 在Android中,长时间的工作(联网)都需要在workerThread中执行

  • 在分线程获得服务器数据后, 需要立即到主线程去更新界面显示数据

 

  • 如何实现线程间通信呢?

    消息机制

    异步任务

测试用例

2.消息机制

2.1 相关API

  • Message :消息

    • 可理解为线程间通讯的数据单元, 可通过message携带需要的数据

    • 创建对象: Message.obtain(what)

    • 封装数据 public int what //id 标识 public int arg1 public int arg2 public Object obj

  • Handler : 处理器

    • Handler是Message的处理器,同时也负责消息的发送和移除的工作

    • 发送即时消息: sendMessage(Message msg)

    • 发送延时消息: sendMessageDelayed(Message msg, long time)

    • 处理消息: handleMessage(Message msg) (回调方法)

    • 移除还未处理的消息: removeMessages(int what)

  • MessageQueue : 消息队列

    • 用来存放通过Handler发送的消息

    • 它是一个按Message的when排序的优先级队列

  • Looper(钩子) : 循环器

    • 负责循环取出Message Queue里面的当前需要处理的Message

    • 交给对应的Handler进行处理

    • 处理完后, 将Message缓存到消息池中, 以备复用

2.2 测试用例

功能描述

  1. 点击GET请求获取: 显示提示正在加载的进度条, 分线程请求网络

  2. 得到数据后, 将数据显示到输入框中, 同时隐藏进度条

 

使用Handler的一般步骤

  1. 创建Handler成员变量对象, 并重写其handleMessage()

  1. 在分/主线程创建Message对象

  1. 使用handler对象发送Message

  1. 在handleMessage()中处理消息

2.3 应用小DEMO

功能描述

1. 初始时

  显示10,可以通过点击按钮改变其值

2. 点击“自动增加”    

  每隔1S上面的文本数值增加1,但最大显示20并作出提示

3. 点击“自动减少”    

  每隔1S上面的文本数值减少1,但最小显示1并作出提示

4. 点击“暂停”  

  上面的数值文本不再变化

2.4 消息机制原理

原理图一

原理图二

3.异步任务

理解

  • 什么是异步任务?

    • 逻辑上: 以多线程的方式完成的功能需求

    • API上: 指AsyncTask类

  • AsyncTask的理解

  • 在没有AsyncTask之前, 我们用Handler+Thread就可以实现异步任务的功能需求

  • AsyncTask是对Handler和Thread的封装, 使用它更编码更简洁,更高效

  • AsyncTask封装了ThreadPool, 比直接使用Thread效率要高

3.1 相关API

  • AsyncTask: 简化Handler处理多线程通信的问题

  • AsyncTask<Params, Progress, Result>

    • Params 启动任务执行的输入参数,比如HTTP请求的URL。

    • Progress 后台任务执行的百分比。

    • Result 后台执行任务最终返回的结果,比如String。

  • execute(Params... params) :启动任务, 开始任务的执行流程

  • void onPreExecute():在分线程工作开始之前在UIThread中执行,一般用来显示提示视图

  • Result doInBackground(Params... params):  在workerThread中执行, 完成任务的主要工作,通常需要较长的时间

  • void onPostExecute(Result result): 在doInBackground()执行完后在UIThread中执行,一般用来更新界面

  • publishProgress(Progress... values) : 在分线程中, 发布当前进度

  • void onProgressUpdate(Progress... values) : 在主线程中更新进度

3.2 测试用例

3.3 异步任务过程

过程分析图

4.应用练习

动态显示带图片列表

 

猜你喜欢

转载自www.cnblogs.com/zhaye/p/10923500.html