2011-04-07 73 views
5

我的AsyncTask阻止了阻止按鈕元素,同時下載圖像和進度對話框顯示延遲 - 它顯示一段時間之後圖像顯示,但下載需要很長時間,並且按鈕被阻止(橙色),對話框不顯示。AsyncTask阻止UI線程並顯示延遲進度條

public Bitmap download(String url, ProgressBar progressbar) throws InterruptedException, ExecutionException { 
    BitmapDownloaderTask task = new BitmapDownloaderTask(progressbar); 
    task.execute(url); 
    return task.get(); 
} 

class BitmapDownloaderTask extends AsyncTask<String, Void, Bitmap> { 



    public BitmapDownloaderTask(ProgressBar progressbar) { 

    } 
    @Override 
    protected void onPreExecute() { 
     dialog = new ProgressDialog(ShowActivity.this); 
     dialog.setMessage("Loading"); 
     dialog.setIndeterminate(true); 
     dialog.setCancelable(false); 
     dialog.show(); 
    } 

    @Override 
    protected Bitmap doInBackground(String... Params) { 
     return imageLoader.getBitmap(params[0]); 

    } 
    @Override 
    protected void onPostExecute(Bitmap bitmap) { 
     dialog.dismiss(); 


    } 
}  

在按鈕監聽器,只需調用下載功能,進度參數是因爲我在imageview的進度條圈 - 對話框僅用於測試,以發現爲什麼會出現延遲和塊。在另一個應用程序中,我使用可運行的線程和元素不被阻塞,但在教程中提到AsyncTask作爲更好的解決方案。

+0

這是做正確的方式,檢查此鏈接:http://www.android-ios-tutorials.com/ 182/show-progressbar-while-download-image-using-asynctask-in-android/ – Houcine 2014-09-16 17:25:16

回答

13

圖像下載確實在後臺線程中執行,但是return task.get();只是等待它完成,這就是阻塞你的主線程。

你應該使用onPostExecute()當任務完成回調,所以不只是關閉該對話框也要做,你需要通過doInBackground()返回的位圖什麼。

+0

非常感謝您的解釋! – Dupla 2011-04-07 21:58:10

+0

感謝您的一天保存提示 – 2013-07-12 15:40:57

2

這是因爲你在呼喚AsyncTask#get

如有必要,等待計算完成,然後獲取其結果。

您應該執行任何你需要的操作使用圖像內onPostExecute()

+0

直接從Android文檔中得到的描述可能會更清楚一點,「wait」意味着非常技術性的意義,「調用線程中不會發生任何事情,例如UI更新」。 – 2017-08-11 08:32:43