2012-10-02 64 views
2

我寫了一小段代碼,它從Internet下載圖像並將它們緩存到緩存目錄中。 它運行在輔助線程中。ListView在從應用程序緩存中加載時滯後

{ 

    String hash = md5(urlString); 
    File f = new File(m_cacheDir, hash); 

    if (f.exists()) 
    { 
     Drawable d = Drawable.createFromPath(f.getAbsolutePath()); 
     return d; 
    } 

    try { 
     InputStream is = download(urlString); 
     Drawable drawable = Drawable.createFromStream(is, "src"); 

     if (drawable != null) 
     { 
      FileOutputStream out = new FileOutputStream(f); 
      Bitmap bitmap = ((BitmapDrawable)drawable).getBitmap(); 
      bitmap.compress(CompressFormat.JPEG, 90, out); 
     } 

     return drawable; 
    } catch (Throwable e) { } 

    return null; 
} 

我用這個代碼來加載ListView項內的畫面,並能正常工作。如果我刪除第一個(如果我從磁盤加載圖像),它會順利運行(並且每次都下載圖片!)。如果我保留它,當你滾動列表視圖時,你會感覺到從磁盤加載圖片時有些滯後,爲什麼?

回答

0

要回答這個問題: 「爲什麼」,我有很多的GC()的消息在我的logcat經歷過。 Android在解碼可能導致垃圾回收的磁盤文件之前分配內存,這對所有線程的性能都是很痛苦的。當你編碼你的jpeg時,也許會發生同樣的情況。

對於解碼部分,您可以嘗試重新使用現有的位圖,如果您有一個讓Android在原位解碼圖像。請看看下面的代碼片段:

final BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inSampleSize = inSampleSize; 
options.inJustDecodeBounds = false; 
options.inMutable = true; 
if (oldBitmap != null) { 
    options.inBitmap = oldBitmap; 
} 
return BitmapFactory.decodeFile(f.getAbsolutePath(), options); 
相關問題