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控件进行更新
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控件进行更新
相关文章推荐
- 软键盘出现后 防止EditText控件遮挡 整体平移UI
- iOS设计—滚动页面的设计 (控件UIScrollView)
- ntpdate:no server suitable for synchronization found
- 如何让 UITableViewCell 中的 imageView 大小固定
- 定制的UIview如何调用
- ORA-23616: Failure in executing block 3 for script 删除queue的方法
- Android Toast与Looper的深入研究,Toast是否属于修改UI界面
- iOS-UIScrollview滑动时标题栏自动隐藏和显示效果
- easyUI draggable插件使用不当,导致拖动div内部文本框无法输入;设置echarts数据为空时就显示空白,不要动画和文字
- EasyUi datagrid中Editor需要注意的:
- 前端面试题Front-end Job Interview Questions
- 获取顶层UIViewController
- Visual Studio 2010初学者的调试指南:Mastering Debugging in Visual Studio 2010 - A Beginner's Guide
- UIScrollView的重用机制的理解
- juery学习总结——例子
- 未能加载文件或程序集“Microsoft.Build.Framework, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a”或它的某一个依赖项。该模块应包含一个程序集清单。
- 智能智能(auto_ptr,unique_ptr,shared_ptr)(更新中。。。)
- UIBezierPath+画板,签名档
- UItableView处于UITableViewStylePlain模式下如何取消HeaderView粘连性
- iOS UIAlertController 使用介绍