Handler机制,AsyncTask与aidl

来源:互联网 发布:淘宝虚拟充值货源 编辑:程序博客网 时间:2024/05/29 08:36

Handler机制

Handler是用来解决线程间通信的,我们都知道,当我们需要进行网络访问等耗时操作时,不能在主线程进行,因为这会阻塞主线程,导致用户体验不好,所以要在子线程进行操作.而访问完网络我们一般都会得到返回数据,我们需要根据这些数据更新UI,但是谷歌规定,UI界面只能在创建它的线程更改,这就需要我们回到主线程去更新UI.这时候就需要用到handler了.

Handler机制由四个主要的类组成,hanlder,messge,messagequeue,looper.当我们初始化第一个hander对象时,系统会通过ThreadLocal创建一个looper,looper初始化会创建一个messagequeue,当我们得到网络请求返回的结果时,会把它封装进message对象中,通过hander发出.系统内部会把这个消息放入消息队列messagequeue中,然后因为looper内部是个死循环,会轮询消息队列,当有新消息进入队列时,就会把它取出,所以我们的消息就会被取出,looper会分析消息,找到对应的handler,将消息交由相应的hanlder处理,我们通过重写handleMessage进行在主线程更新UI的操作.

 

AsyncTask

通过handler进行线程间通信比较灵活,但是代码结构也比较臃肿,所以谷歌提供了Asynctask供我们使用,Asynctask底层也是使用的handler,它是对handler的封装,主要有三个方法,onPreExecute,doInbackground,onPostExecute, onPreExecute中用来处理进行访问网络前的UI准备工作,如进度条的显示等,这个方法在主线程进行, doInbackground中用来处理网络访问等耗时操作,这个方法在子线程执行,并可以将结果通过返回值传递给onPostExecute,在onPostExecute中进行UI的更新操作,这个方法在主线程中进行.如果我们需要在网络访问过程中实时更新UI,例如下载进度条进度随着下载变化,我们可以在doInbackground中调用publishProgress将进度值传递给onProgressUpdate,在这个方法中进行更新进度操作.使用ansyctask使代码更加工整,格式良好,而且容易理解,我们需要进行下载中更新UI时通常才有Asynctask.

 

aidl

HandlerAsyncTask都是用来线程间通信的,在安卓开发中,有时候我们不仅需要进行线程间通信,还需要进行进程间通信,比如我这个应用要调用另一个应用的方法,安卓是允许这种情况出现的.这就是IPC机制,IPC机制是Inter process connection,线程间通信.安卓中的IPC机制是通过aidl技术实现的,它底层是通过代理实现的,根本是因为每个应用都运行在内存上,从而可以进行不同应用间访问.我们想要调用另一个应用的方法,首先这个方法需要暴露出来,我们一般会写一个接口,定义需要调用的方法,改后缀名为aidl,系统会自动生存一个java,它里面有一个stub内部类,这个类既继承了binder类又实现了我们定义的接口.我们需要调用的另一个应用一般称为服务端,调用一般通过服务,我们需要在这个服务中创建一个类继承stub内部类,然后实现其中的需要调用的方法,再在服务的onbind方法中返回刚才创建类的对象,这样服务端就写好了.在客户端,我们要把服务端的aidl文件拷贝过来,需要带包名拷贝,然后绑定服务,绑定服务传入ServiceConnection的子类对象, ServiceConnection是一个接口,在这个接口onServiceConnected方法中我们得到服务端传过来的binder对象,由于这个对象既继承了binder又实现了我们定义的接口,它是多态的,我们通过asInstance得到我们定义的接口对象,然后就可以调用服务端的方法了.

Aidl技术可以解决线程间通信,但要进行线程间通信有很多方法,例如通过contentProvider,内容提供者添加URI匹配对外暴露方法,contenResolver内容解析者通过解析相应的uri调用方法.可以通过广播, Messager进行线程间通信,这些都可以进行线程间通信,而使用aidl一般是当需要来自不同的客户端访问服务并且需要处理多线程问题时可以使用aidl,这是谷歌官方文档这样说的.

0 0