2013-10-23 145 views
0

我需要從服務器下載一些位圖到android中。我想用一個使用.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)執行的AsyncTask。但我的執行者正在變得不知所措。所以我認爲,如果我拖延,這應該有所幫助。所以我的問題是:我如何延遲執行者?我正在考慮使用handler.postDelay,但只接受runnables。有沒有辦法讓它與執行者一起工作?從服務器下載許多圖像到Android

一個很好的解決方案可能是一次運行20個調用,然後等待100毫秒來運行下一個20.有沒有人知道在android上執行該操作的方法?

@pete

我每次調用一個線程。我不確定一個線程中的多個調用是否會導致問題。

@Override 
protected Bitmap doInBackground(Void... params) { 
    try { 

     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setDoInput(true); 
     conn.connect(); 
     InputStream is = conn.getInputStream(); 
     return BitmapFactory.decodeStream(is); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 
} 
+0

您對從您檢索的圖像創建的位圖做了什麼?如果不將它們寫入文件並調用Bitmap.recycle(),則可能會耗盡內存。 –

+1

您是否考慮過爲每個圖像使用IntentService?如果沒有看到我的答案:http://stackoverflow.com/questions/19291462/android-download-multiple-files-one-after-another-and-show-progress-in-listview/19292348#19292348 – cYrixmorten

回答

0

如果你只是想添加一個暫停,可使用在doInBackground如下:

count = 1; 
// use your loop of choice 
for(int i = 0; i < n; i++) { 
      // Do your stuff here... 
    if(count % 20) { // Sleep every 20 iterations 
     Thread.sleep(100); 
    } 
    count++; 
} 

然而,隨着@petey說,代碼將是一個更好的幫助。取決於你在做什麼,可能比使用AsyncTask(也許是IntentService)更好。

+0

我編輯我的代碼如此顯示示例。我會盡力。 –

+0

像裏克問,你在做什麼位圖?如果他們正在進入某種ListView/GridView,那麼[Universal Image Loader](https://github.com/nostra13/Android-Universal-Image-Loader)可能是更好的解決方案。像@physphil一樣,我已經使用它並且效果很好。 – Jason

0

+1給cYrixmorten使用IntentService的想法。根據我的經驗,它比使用AsyncTask更可靠,特別是在下載大量信息時。

如果你正在專門處理下載圖像,你看過Universal Image Loader?它是專門爲此目的設計的開源庫。我已經在我的幾個項目中使用了它,並且我發現它非常易於實現,它爲您處理圖像下載,線程和緩存。

希望這會有所幫助!

相關問題