安卓学习——消息机制与异步任务

来源:互联网 发布:潍坊四中的网络签章 编辑:程序博客网 时间:2024/05/16 14:03

安卓消息机制与异步任务

在学习安卓消息机制与异步任务之前,我们要先明白几个点:

  • 在Android中,只有在UIThread中才能直接更新界面
  • 在Android中,长时间的工作(联网)都需要在分线程中执行
  • 在分线程获得服务器数据后, 需要立即到主线程去更新界面显示数据

那么我们该如何实现线程之间的通信呢?这里给大家列举两种方法:消息机制与异步处理:

消息机制:

在讲消息机制之前,先讲两个会用到的API:

Message:消息

  • 可理解为线程间通讯的数据单元, 它可以在内部携带少量的信息,用于再不同线程之间交换数据。除了what字段,还可以用arge1和arg2字段来携带一些整型数据,使用obj字段携带一个Object对象。
  • 创建对象: 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)

在了解了这两个API之后,便是使用Handler的步骤了:

  1. 创建Handler成员变量对象, 并重写其handleMessage()
  2. 在分/主线程创建Message对象
  3. 使用handler对象发送Message
  4. 在handleMessage()中处理消息

异步任务:

什么是异步任务?

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

对AsyncTask的理解

  • 在没有AsyncTask之前, 我们用Handler+Thread就可以实现异步任务的功能需求
  • AsyncTask是对Handler和Thread的封装, 使用它更编码更简洁,更高效
  • AsyncTask封装了ThreadPool, 比直接使用Thread效率要高

与异步任务相关的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) 在主线程中更新进度

在使用AsyncTask时需要遵循五大原则

  1. AsyncTask 类必须在UI线程中被加载,在JELLY_BEAN版本后将会自动完成。
  2. AsyncTask的实例化必须在UI线程中完成。
  3. AsyncTask的execute(Params…)方法必须在UI线程中被调用。
  4. 不需要手动调用 这些方法:onPreExecute(), onPostExecute(Result), doInBackground(Params…), onProgressUpdate(Progress…) 。
  5. 一个AsyncTask实例只能被执行一次(第二次执行将会抛出异常)。

以上便是安卓消息机制与异步任务,希望对大家有所帮助,本人为初学者,文笔有限,有错漏欢迎提出,谢谢!

原创粉丝点击