android多线程asyncTask与Handler用法

来源:互联网 发布:使用js完成九九乘法表 编辑:程序博客网 时间:2024/06/05 21:59

前言:刚刚学,有什么问题欢迎指正。

一、Handler

Handler是一个用作线程之间相互通信的类。

Handler一共由四个部分组成 handler,Message,MessageQueue,Looper。其中:

handler是用来发送消息的,message可以携带少量信息,MessageQueue是一个消息队列,而Looper是一个管理消息队列的类。当一条message通过handler的sendmessage方法被发送以后,这条消息就会加入到MessageQueue队列中,等待被发送到handler对象的回调方法handlerMessage中。而looper在这个过程中充当了一个管理者的角色,管理消息队列。

用Handler进行异步操作的基本流程为:

1.在类中创建一个Handler的实例化对象,并实现handleMessage方法;

2.在另一个线程中创建Message的一个实例化对象;

3.将要发送的消息写入Message对象的相应字段,what字段可以携带一个整型数据,arg1和arg2也用来携带整型字段,那么它们有什么区别呢?

据说what是用来描述这个handler对象操作的类型的,而arg1和arg2是专门用来携带整型数据的,另外如果只需要传递少量的整型数据的话和setData()方法相比arg1和arg2是消耗更低的选择。obj字段是用来携带一个对象的,就是刚说的setData方法可以传递一个Bundle,在handMessage中可以通过对应的getData()方法取出来。

4.在handleMessage中可以取出传递过来的数据。

二、AsyncTask

AsyncTask是android对 异步消息处理机制做得一个封装,AsyncTask可以让完全不了解异步消息处理机制的开发者也能进行异步消息的处理。

AsyncTask有四个主要的方法,

onPreExcute()方法是用来在进行后台任务之前对界面做一些ui操作,例如显示一个进度条等。

doInbackground()方法是用来处理后台任务的,这个方法中的所有代码都运行在一个独立的线程中,所有的耗时操作都应该放到这里面进行处理。在这个方法里不能进行UI操作,如果要返回一些操作的进度来更新UI可以使用oublishProgress(Progress.....)方法。

onprogressUpdate(Progress...)方法在publish方法被调用后执行,用来接收后台传过来的数据更新UI

onPostExecute(Result)方法在后台任务执行完毕以后被调用,其中的参数是后台任务的返回值,在这个方法中可以将任务执行的结果显示到UI上,也可以进行一些收尾工作,比如关闭进度条。

三、Handler和AsyncTask区别

Handler适用于所有的耗时操作,但是操作起来可能没有AsyncTask方便,AsyncTask是封装好的,操作起来更加方便,但是只适合用来做一些时间相对比较短异步操作,像下载,缓冲这种需要很长时间的操作,还是应该使用Handler。

原创粉丝点击