在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线程交互。
今晚比较完了,先写到这里,后续再补充。