2012-06-20 79 views
-2

確定這是一個非常常見的問題,但我有點不同,我找不到其他主題的解決方案,所以我在這裏發佈了一個新的解決方案。我有一個顯示ListView的應用程序。 ListView的每一行,我有一個ImageView使用ListAdapter從SD卡加載一個小的位圖圖標(它很小,所以問題不在於大小)。現在,如果我慢慢滾動列表,它可以正常工作。但是,如果我滾動真快,當ListView控件是足夠長的時間,它沒有顯示的圖標了,並在logcat的消息是這樣的:Android ListView OutOfMemoryError:位圖大小超過虛擬機預算

126 600-byte external allocation too large for this process. 

VM不會讓我們分配126600個字節

然後應用程序崩潰和logcat顯示:

java.lang.OutOfMemoryError: bitmap size exceeds VM budget 

我測試了2個不同的設備,其中只有一個出現此錯誤,另一個正常工作。 請注意,只有當ListView滾動速度非常快時纔會出現此錯誤。那是因爲創建的新線程與垃圾回收的速度不匹配嗎? 在這種情況下,有人可以給我一些建議嗎?

+0

確實需要一些功課。 –

+0

@Paresh Mayani:你是什麼意思?我真的很新的android,所以請更具體的 – user1417127

+0

在提問時,請先做一些搜索,這裏已經提出了很多問題:[** OutOfMemoryError:位圖大小超過虛擬機預算**](http:/ /stackoverflow.com/search?q=OutOfMemoryError%3A+bitmap+size+exceeds+VM+budget) –

回答

0

使用位圖時,與ListView一起使用時,您將主要獲得OutOfMemory。

所以你應該去LasyList在這裏顯示。

將會照顧您的圖像加載。

要使用SD卡工作,你需要替換ImageLoader的類中的方法如下圖所示

private Bitmap getBitmap(String url) 
    { 
     // If is from SD Card 
     try { 
      File file = new File(url); 
      if(file.exists()) 
      { 
       return BitmapFactory.decodeFile(url); 
      } 
     } catch (Exception e) { 

     } 

     File f=fileCache.getFile(url); 

     //from SD cache 
     Bitmap b = decodeFile(f); 
     if(b!=null) 
      return b; 

     //from web 
     try { 
      Bitmap bitmap=null; 
      URL imageUrl = new URL(url); 
      HttpURLConnection conn = (HttpURLConnection)imageUrl.openConnection(); 
      conn.setConnectTimeout(30000); 
      conn.setReadTimeout(30000); 
      conn.setInstanceFollowRedirects(true); 
      InputStream is=conn.getInputStream(); 
      OutputStream os = new FileOutputStream(f); 
      Utils.CopyStream(is, os); 
      os.close(); 
      bitmap = decodeFile(f); 
      return bitmap; 
     } catch (Exception ex){ 
      ex.printStackTrace(); 
      return null; 
     } 
    } 
+0

我的方法和你的方法一樣,並沒有解決問題 – user1417127

相關問題