2015-02-07 56 views
1

我有一個AsyncTask,它獲取一個URL作爲參數,並在完成時返回來自該URL的圖像的Bitmap。當我開始活動時,我想顯示文本(而不是圖片),顯示「加載...」,在後臺運行ImageFetcher,完成後,將圖像設置爲ImageView加載圖像並在加載完成時進行設置

的問題是,如果我運行:

ivPoster.setImageBitmap(imgFetcher.execute(m.getPosterUrl()).get()); 

,直到圖像加載它不會加載整個活動。它跳過幀。

所以我在任務上設置一個上完成監聽器,返回的位圖,並試圖設置圖像的位圖檢索後:

imgFetcher.setOnFinishListener(new OnTaskFinished() { 

    @Override 
    public void onFinish(Bitmap bm) { 
     // hide the loading image text 
     tvLoading.setVisibility(View.INVISIBLE); 
     // place the image 
     ivPoster.setImageBitmap(bm); 
    } 
}); 

imgFetcher.execute(m.getPosterUrl()); 

然而,它仍然會跳幀和「做太多的工作在主線程上'。
如何防止跳幀?

+0

請看看第二個代碼。在那裏它不會調用'get()',而是用數據調用'onFinish'。 – Gofilord 2015-02-07 18:44:45

回答

1

您可以改爲利用中的AsyncTask UI線程。如果您運行該線程中的代碼來加載圖像,則程序的其餘部分不必等待。

使用此documentation瞭解更多信息。您可以使用onPostExecute()方法或onProgressUpdate()方法,而不是在後臺線程中導致等待。

主線程與UI線程相同。你應該使用它來改變你的用戶界面。這是爲了讓你的應用程序在執行後臺代碼之前不會等待圖形加載,而是同時進行。爲了使用AsyncTask中的ImageView,如果AsyncTask是一個子類並在執行之前實例化,則可以使ImageView成爲全局。否則,將其作爲參數傳遞給AsyncTask。

+0

感謝您的快速回答。我其實想到了這一點,但是我從某個地方讀到,UI的變化只能從主線程完成。這不是問題嗎? – Gofilord 2015-02-07 18:47:45

+0

@Gofilord onPostExecute方法在UI線程上運行。onPostExecute的目的是發佈必須在UI線程上完成的結果(例如更新視圖層次結構或設置文本視圖中的文本)。 – 2015-02-07 18:48:26

+0

主線程是UI線程。很抱歉混淆,但你應該使用它來改變你的用戶界面。這是爲了讓你的應用程序在執行後臺代碼之前不會等待圖形加載,而是同時進行。 – apoorvk 2015-02-07 18:50:53

1
private class ImageDownloaderTask extends AsyncTask<String, Void, Bitmap> { 
    ImageView mImageView; 
    String mUrl; 

    public ImageDownloaderTask(ImageView imageview, String url) { 
     this.mImageView = imageview; 
     this.mUrl = url; 
    } 

    @Override 
    protected Bitmap doInBackground(String... params) { 
     //Download here 

    } 

    @Override 
    // Once the image is downloaded, associate it to the imageView 
    protected void onPostExecute(Bitmap bitmap) { 
     mImageView.setImageBitmap(bitmap); 
    } 
} 

希望的代碼片段有助於

相關問題