您的位置:首页 > 产品设计 > UI/UE

android UI线程和子线程的几种交互方式

2016-03-11 13:38 267 查看
我们在进行安卓开发的时候,经常会处理一些耗时的操作,所以经常会开启子线程去执行这些耗时的操作,那么,UI线程怎么和子线程交互的呢,一下提供5种交互方式:

1、handler

2、Activity.runOnUIThread(Runnanle r)

3、view.post(Runnable r)

4、view.postDelayed(Runnale r)

5、AsyncTask

1:handler

handler是我们平时比较常用的一个ui线程和子线程的一种交互方式,这里简单说一下handler在线程间传递消息的机制:Looper MessageQueue Message

Message:顾名思义,这就是一个消息,他可以封装子线程向UI线程传递的数据,然后handler通过sendMessage方法将这个消息发送出去,那么发送了消息之后呢,这就要引出MessageQueue了

MessageQueue:这是一个消息队列,专门用来存储handler存储的Message.刚才handler发送的Message就存储在这个消息队列中。

Looper:可以将Looper理解为一个消息遍历者,它会遍历MessageQueue,当它发现MessageQueue中存在Message时,就会将这个Message取出来交给handler的handlerMessage方法处理。

注意:一个Looper对象维护一个特定的MessageQueue,而一个MessageQueue维护一个特定线程中的Message,所以一般我们要手动的将一个Looper对象和线程相关联(ui线程除外)

2:Activity.runOnUIThread(Runnanle r)

采用这个方式实现UI线程和子线程的交互步骤:

1:编写后台线程,在后台线程中你可以操控view

2:创建后台线程的实例

3:调用UI线程对应的Activity.runOnUIThread(Runnable r),将后台线程的实例作为参数传入其中

注意:不用调用后台线程的start方法

3:view.post(Runnable r)

该方法的操作步骤和方法二基本类似,只是在后台线程中能操控的view被限制了,只能是调用该函数的view

1:编写后台线程,这次你可以直接调用UI控件,不过该ui控件只能是该view

2:创建该后台线程的实例

3:调用该view的post方法,将后台线程的实例作为参数传入该函数中

4:view.postDelayed(Runnale r,long delay)

该方法是第三种方式的扩展,第二个参数用于指定延迟多少秒后运行该线程

5:AsyncTask

AsyncTask是专门用来处理子线程和UI线程交互的工具

AsyncTask拥有的三个重要的参数:

1、Params

2、Progress

3、Result

Params是后台线程所需要的参数,有些子线程需要外界提供参数,比如你要在网上下载一张图片,你得传入该图片的下载地址

Progress是后台线程处理任务完成的进度

Result是后台线程执行的结果,一般需要传给ui线程做处理

AsyncTask4个重要的回调方法

1、onPreExecute

这个函数运行在ui线程,它主要是为运行后台线程做准备,当这个函数执行完毕,跟着就执行doInBackGround()

2、doInBackGround

这个函数运行在后台线程,它拥有参数Params,并且可以返回Result,在后台线程运行中,为了更新任务完成的进度,需要调用publishProgress方法,该方法拥有参数progress,当该方法执行完毕后,就会执行onProgressUpdate更新进度,onProgressUpdate方法是在ui线程中执行的

3、onPostExecute

该方法运行在ui线程中,该方法拥有参数Result,可以对ui控件进行更新
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息