2012-01-26 65 views
1

我正在使用動態填充列表視圖的應用程序,其中每個項目包含需要下載的圖像。另外,當點擊列表中的任何項目時,它會打開一個詳細頁面,再次顯示除了一些以外的相同圖像。使用ImageDownloader緩存而不緩存

我們知道,最好是使用一個異步任務做實際的下載和良好的做法是使用一個緩存機制既加快圖像顯示以及減少在多個下載實際數據使用量。

經過多次搜索後,我最終使用了位於http://developer.android.com/resources/samples/XmlAdapters/src/com/example/android/xmladapters/ImageDownloader.html的Google示例代碼,該代碼聲稱是下載圖像的異步和緩存方法。

我遇到的問題是,這個類在被調用時似乎沒有正確緩存圖像。所以這裏去....

的代碼在我的自定義類(即建立列表視圖)的部分,我所說的圖像下載是這樣的:

ImageDownloader getimage = new ImageDownloader(); 
getimage.download(logoURL, ivLogo); 

隨着ImageDownloader是上面提到的類。

圖像加載,但很明顯,他們每次都從網絡加載。我加了一些記錄到ImageDownloader.class以幫助跟蹤所發生的事情的時候。我發現,第一次請求圖像時,第一次調用get cache(如預期),getBitmapFromCache返回null,並調用forceDownload。

public void download(String url, ImageView imageView, String cookie) { 
    resetPurgeTimer(); 
    Bitmap bitmap = getBitmapFromCache(url); 
    Log.i(LOG_TAG, "Bitmap is: " + bitmap); 

    if (bitmap == null) { 
     Log.i(LOG_TAG, "Forcing Download"); 
     forceDownload(url, imageView, cookie); 
    } else { 
     cancelPotentialDownload(url, imageView); 
     imageView.setImageBitmap(bitmap); 
    } 
} 

隨着執行的進行向下類到它增加了圖像/ URL到緩存

private void addBitmapToCache(String url, Bitmap bitmap) { 
    Log.i(LOG_TAG, "Incoming Add Cache Info: URL: " + url + " Bitmap: " + bitmap); 
    if (bitmap != null) { 
     Log.i(LOG_TAG, "Entering the add image to cache section"); 
     synchronized (sHardBitmapCache) { 
      sHardBitmapCache.put(url, bitmap); 
      Bitmap returnedbitmap = getBitmapFromCache(url); 
      Log.i(LOG_TAG, "Returned bitmap immediately after adding: " + bitmap); 
     } 
    } 
} 

我添加記錄到兩個驗證中加入高速緩衝存儲器,然後執行getBitmapFromCache點,並且日誌顯示返回的位圖/ URL散列正確返回。

Incoming request to get Image, URL: http://www.yourlogoresources.com/wp-content/uploads/2011/11/Wendys-logo.png 

Trying Hard Cache with URL: http://www.yourlogoresources.com/wp-content/uploads/2011/11/Wendys-logo.png 

Hard Bitmap is: null 

Trying Soft Cache with URL: http://www.yourlogoresources.com/wp-content/uploads/2011/11/Wendys-logo.png 

Return from initial entry call: null 

Entering forced Download 

Incoming Add Cache Info: URL:http://www.yourlogoresources.com/wp-content/uploads/2011/11/Wendys-logo.pngBitmap: [email protected] 

Entering the add image to cache section 

Trying Hard Cache withURL: http://www.yourlogoresources.com/wpcontent/uploads/2011/11/Wendys-logo.png 

Hard Bitmap is: [email protected] 

Returned bitmap immediately after adding:[email protected] 

所以它出現在高速緩存被正確填充,但是,圖像被要求在下一次(即當您滾動列表視圖),緩存圖像不再次getBitmapFromCache(URL)返回從空發現入口點下載。

Incoming request to get Image, URL: http://www.yourlogoresources.com/wp-content/uploads/2011/11/Wendys-logo.png 

Trying Hard Cache with URL: http://www.yourlogoresources.com/wp-content/uploads/2011/11/Wendys-logo.png 

Hard Bitmap is: null 

Trying Soft Cache with URL: http://www.yourlogoresources.com/wp-content/uploads/2011/11/Wendys-logo.png 

Return from initial entry call: null 

Entering forced Download 

所以我很茫然這裏,爲什麼它會出現填充高速緩存,但是當它被再次檢查,返回什麼,但空。

編輯

我結束了使用從我的主要活動的靜態參考ImageDownloader如下:

public class myActivity extends Activity implements OnClickListener { 
    public final static ImageDownloader GetImage = new ImageDownloader(); 

然後叫,像這樣的任何地方,我需要一個ImageDownload:

myActivity.GetImage.download(logoURL, ivLogo); 

感謝所有幫助的人。

回答

1

看到的ImageDownloader代碼。

它採用主緩存 private final HashMap<String, Bitmap> sHardBitmapCache

和二級靜態緩存 private final static ConcurrentHashMap<String, SoftReference<Bitmap>> sSoftBitmapCache

項踢出初級緩存放入二級緩存。

現在每次您想要下載的圖片,如果你創建的ImageDownloader一個新的實例,您實際上不使用緩存機制,因爲每個ImageDownloader實例只能有一個單一的形象,你下載使用此實例。

PS:您的問題代碼看起來像您每次下載使用實例。

+0

維克拉姆,是的,我相信你是對的,我爲每個圖像站起來一個新的例子。我認爲我應該找到一種方法來站起來一個I​​mageDownloader實例,並簡單地爲每個下載使用單個實例? – brad

+0

爲了澄清,我有一個Activity類,它對一個CustomAdapter類(以一個數組作爲輸入)進行初始調用,該類調用ImageDownloader類來處理數組中的每個條目。對於Java來說真的很陌生,我只是不確定如何去實例化ImageDownloader的一個實例,但能夠從多個其他類訪問它。任何指針將不勝感激。 – brad

+0

您可以通過Application對象公開ImageDownloader的實例。這裏有一個例子:http://stackoverflow.com/questions/708012/android-how-to-declare-global-variables。或者你可以簡單地把它變成一個靜態對象 –