AsyncTask是Android中用于异步处理的辅助类,十分的有用,能够让我们简单的在工作线程中进行耗时操作(比如I/O,网络请求),然后在UI线程进行更新操作等。
AsyncTask的用法就不说了,相信大家都用了几次了,主要的方法有:
onPreExecute
doInBackground
onProgressUpdate
onPostExecute
其中doInBackgroud运行在子线程中,其他均运行在主线程。
在doInbackground中去调用onProgressUpdate方法,以及完成时调用onPostExecute方法,都是使用Handler机制,在主线程进行回调操作。
所以,在new AsyncTask的时候,会初始化一个Handler,用于线程间通信。
然后执行execute(Param)的时候,会使用默认的串行调度器去进行任务调度,具体做法是维护了一个任务队列mTasks,将每一个AsyncTask封装成一个Future对象,执行时将Future对象加入到mTasks中放入线程池执行,并在执行完成后从mTasks中取出下一个Future对象进行运行。所以能够达到串行运行的效果。在Future对象在线程池运行过程中,会调用doInbackground方法,执行完成后会回调onPostExecute方法。
public synchronized void execute(final Runnable r) {
mTasks.offer(new Runnable() {
public void run() {
try {
r.run();
} finally {
scheduleNext();
}
}
});
if (mActive == null) {
scheduleNext();
}
}
protected synchronized void scheduleNext() {
if ((mActive = mTasks.poll()) != null) {
THREAD_POOL_EXECUTOR.execute(mActive);
}
}