Android AsyncTask - 它是如何工作的?

时间:2015-08-10 02:56:01

标签: java android asynchronous

根据我的理解,线程通过共享资源进行通信,例如:一个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调用的。我在哪里错过了?

1 个答案:

答案 0 :(得分:0)

简而言之:主线程从队列执行任务,并在队列为空时处于空闲状态。当AsyncTask完成后台工作时,它会将一个任务放入主线程的队列中。该任务是致电onPostExecute(...)