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

xiaoxiao2021-02-28  148

安卓消息机制与异步任务

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

在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的步骤了:

创建Handler成员变量对象, 并重写其handleMessage()在分/主线程创建Message对象使用handler对象发送Message在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时需要遵循五大原则

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

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

转载请注明原文地址: https://www.6miu.com/read-26710.html

最新回复(0)