Android提供的异步类和接口

在Android开发中,我们会经常遇到长时间操作,这些操作又要与UI进行交互,但是这些长时间操作又不能运行在UI线程中,否则会引起ANR问题。

我们可以通过Handler机制,自己写后台线程与UI线程进行交互。

但是Android系统中也提供了一些已经写好的类和接口,供我们直接使用。

其实这些写好的异步类的机制都是相同的,都是使用Handler机制,绑定一个内部线程,然后通过Message和各个线程的handler进行交互。


下面主要介绍一下Android提供的异步类:

(1)AsyncTask.java:

该类地址frameworks/base/core/java/android/os,

它是应用最广的异步操作类,对外提供几个重要的函数,其中这些函数分为两个种类,一种是运行在被调用者的线程中函数,一般是UI线程,第二类就是运行在后台线程的函数,这些函数中就是存放长时间操作。

a)运行在后台线程的函数:

protected abstract Result doInBackground(Params... params),它是一个抽象类,用户需要重写它,将需要长时间的操作放到这里面。


b)运行在被调用者的函数:

protected void onPreExecute(),该函数是在doInBackground()函数运行之前运行,对于用户的实现是选择的。

protected void onProgressUpdate(Progress... values),该函数用来显示后台线程执行的进度。

protected void onPostExecute(Result result):该函数是运行在doInBackground()函数之后的,就是将后台线程运行最后结果返回给UI界面。


实现机制:

它里面定义了一个线程池,和一个内部Handler,线程池就是用来执行doInBackground()里面的操作,内部handler是在创建AsyncTask时候创建的因此,它绑定的是创建者的线程,即UI线程,线程池执行后台操作,操作结果返回给UI线程就是通过内部Handler对象传递实现。


(2)IntentService.java;

代码路径:framework/base/core/java/android/app

它继承了Servcie,它里面提供提供了后台线程执行长时间操作,用户需要实现里面的后台函数onHandleIntent()即可。

其他跟Service一样,不过有一点需要注意,你不能实现onStartCommand()函数,一般情况下,若要启动该服务,使用startService()函数,用户无需调用stopServcie()函数来暂停该服务,因为IntentService内部执行完onHandleIntent()函数后会自动停止服务。


它里面定义了一个内部Handler和一个HandlerThread线程,内部Handler绑定HandlerThread线程,因此,内部handler运行在后台线程中,IntentService是一个Servcie类型,因此运行在UI线程中,通过内部Handler来实现UI线程和后台线程的交互。


(3)AsyncQueryHandler.java:

代码路径:frameworks/base/core/java/android/content

该类主要是用来数据库操作时候的异步类,它继承了Handler,自己运行在创建者线程中,一般是UI线程,内部创建了一个后台工作Handler,后台工作Handler绑定到一个后台HandlerThread里面,当UI线程发起后台操作时候,通过后台工作Handler发送到后台线程HandlerThread里面执行,当后台执行完毕以后,再通过AsyncQueryHandler发送到UI(他是一个Handler对象)线程中,实现与UI线程交互。


今晚比较完了,先写到这里,后续再补充。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值