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

我们在进行安卓开发的时候,经常会处理一些耗时的操作,所以经常会开启子线程去执行这些耗时的操作,那么,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控件进行更新

你可能感兴趣的:(android UI线程和子线程的几种交互方式)