根据我的理解,线程通过共享资源进行通信,例如:一个BlockingQueue。当等待从另一个接收消息的线程时,它将在访问队列时阻塞,而另一个线程放弃锁定。
然而,在Android AsyncTask中,似乎UI线程(接收器)不必阻止 在等待来自其他线程的消息时。
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}
回调onProgressUpdate()似乎是在没有阻塞UI线程的情况下从no调用的。我在哪里错过了?
答案 0 :(得分:0)
简而言之:主线程从队列执行任务,并在队列为空时处于空闲状态。当AsyncTask
完成后台工作时,它会将一个任务放入主线程的队列中。该任务是致电onPostExecute(...)
。