AsyncTask中任务是提交线程池中运行的,它使用Handler与主线程通信。代码如下:
AsyncTask.java
private static class InternalHandler extends Handler {
public InternalHandler() {
super(Looper.getMainLooper());
}
@SuppressWarnings({"unchecked", "RawUseOfParameterizedType"})
@Override
public void handleMessage(Message msg) {
AsyncTaskResult<?> result = (AsyncTaskResult<?>) msg.obj;
switch (msg.what) {
case MESSAGE_POST_RESULT:
// There is only one result
result.mTask.finish(result.mData[0]);
break;
case MESSAGE_POST_PROGRESS:
result.mTask.onProgressUpdate(result.mData);
break;
}
}
}
使用主线程的Looper,Looper.getMainLooper()初始化化Handler,将message添加到主线程的消息队列参与循环。
例如刷新progress,发送消息代码如下,因此如果要刷新progress,需要在doInBackground()里调用这个方法,将消息发送到主线程。
@WorkerThread
protected final void publishProgress(Progress... values) {
if (!isCancelled()) {
getHandler().obtainMessage(MESSAGE_POST_PROGRESS,
new AsyncTaskResult<Progress>(this, values)).sendToTarget();
}
}
Handler中Loop起来之后就死循环在不停的跑,dispatchMessage,收到消息就在这个主线程循环里运行了,就这样。
在Handler中就可以调用主线程的onProgressUpdate可以刷新界面了。