2012-09-18 99 views
2

我正在探索Android開發人員網站並閱讀一些文章。目前使用的AsyncTask列表視圖defering圖像加載的一種方式:製作ListView滾動平滑

// Using an AsyncTask to load the slow images in a background thread 
new AsyncTask<ViewHolder, Void, Bitmap>() { 
    private ViewHolder v; 

    @Override 
    protected Bitmap doInBackground(ViewHolder... params) { 
     v = params[0]; 
     return mFakeImageLoader.getImage(); 
    } 

    @Override 
    protected void onPostExecute(Bitmap result) { 
     super.onPostExecute(result); 
     if (v.position == position) { 
      // If this item hasn't been recycled already, hide the 
      // progress and set and show the image 
      v.progress.setVisibility(View.GONE); 
      v.icon.setVisibility(View.VISIBLE); 
      v.icon.setImageBitmap(result); 
     } 
    } 
}.execute(holder); 

但是,對我來說,似乎有與該代碼有點問題。假設我們從互聯網加載圖像,並且每個圖像都需要幾秒鐘才能加載。

作爲一個用戶,如果我們滾動列表然後切換到另一個活動,會有一些AsyncTasks在後臺運行,並佔用一些帶寬,而我們可能需要它在我們的新前臺活動中。

你通常如何使用他們的方法來處理這種情況?回收視圖時,你是否殺掉了與持有人相關的AsyncTask?你是否跟蹤哪些AsyncTasks仍在運行的適配器,並在活動停止時將其全部取消?還有其他的方式嗎?

我的問題主要是關於architecturing清洗件來解決這個問題(沒有這麼多的實現)

回答

2

我要說的是,大多數時間下載不採取足夠的時間讓這成爲一個問題,但如果它應該殺死它們。同樣在他們的實現中,他們下載一個圖像並檢查視圖是否被重用。如果你有很長時間的延遲,你應該在重新使用時取消任務。請注意,Android版本的任務執行順序不同。從docs

第一次引入時,AsyncTasks在單個後臺線程上被串行執行。從DONUT開始,將其更改爲允許多個任務並行操作的線程池。從HONEYCOMB開始,任務在單個線程上執行,以避免並行執行導致的常見應用程序錯誤。

如果您真的想要並行執行,可以使用THREAD_POOL_EXECUTOR調用executeOnExecutor(java.util.concurrent.Executor,Object [])。

+0

單獨採取,下載可能需要一秒鐘,但如果您獲得了100個項目的列表或網格......您是否只在項目顯示時才下載?如果你在扔東西呢? –

+0

根據要求可以有各種各樣的變化。您應該看一個有趣的示例是:http://androidxref.com/4.1.1/xref/development/samples/ApiDemos/src/com/example/android/apis/view/List13.java如果沒有加載滾動時完成。您當然也可以將數據緩存在後臺線程(可能包含在服務中),無論是閃存還是RAM。還有一些LruCache(http://developer.android.com/reference/android/support/v4/util/LruCache.html)可能會對這些問題感興趣。 –