2011-12-16 34 views
0

我的代碼:出與畫廊內存錯誤的Android中

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
ImageView iv = new ImageView(mContext); 
Drawable photo = new BitmapDrawable(loadBitmap(URL)); 
iv.setImageDrawable(photo); 
iv.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 
return iv; 
} 

private Bitmap loadBitmap(String url) { 
try { 
Bitmap bm = BitmapFactory.decodeStream((InputStream)this.fetch(url)); 
return bm; 
} 
catch(Exception e) { 
e.printStackTrace(); 
return null; 
} 
} 

public Object fetch(String address) { 
try { 
URL url = new URL(address); 
Object content = url.getContent(); 
return content; 
} 
catch(Exception e) { 
e.printStackTrace(); 
} 
return this; 
} 

我嘗試查看約100張照片與URL中的畫廊。 但是,當查看約10張照片時,出現了內存不足錯誤。 我該怎麼做才能避免錯誤?

我嘗試修改getView(),如下。

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
ImageView iv = new ImageView(mContext); 
InputStream is = (InputStream)this.fetch(URL); 
Drawable photo = Drawable.createFromStream(is, "src"); 
iv.setImageDrawable(photo); 
iv.setScaleType(ImageView.ScaleType.CENTER_INSIDE); 
return iv; 
} 

的內存問題是仍然存在。 錯誤消息是java.lang.OutOfMemoryError: bitmap size exceeds VM budget,在行Drawable photo = Drawable.createFromStream(is, "src");

+0

略無關,你的核心問題,但請確保您做耗時的操作(在這裏 - 下載圖像/照片)在輔助線程(最好是在一個異步任務)。這樣你將提供無縫的用戶體驗。 – Abhijit 2011-12-16 01:50:55

回答

1

這是一個已知的位圖和內存問題。有一件事是肯定的,你必須相應地回收位圖。或者根本不使用位圖。這是您的問題的解決方案。而不是從位圖創建drawable,你可以直接從url創建一個drawable。

使用下面的代碼來創建drawable。

 InputStream is = (InputStream) new URL(url).getContent(); 
     Drawable photo = Drawable.createFromStream(is, "src name"); 
5

這是一個衆所周知的問題,廚房沒有回收的觀點,也有「生態」畫廊的不同自定義實現。

看看這個SO post

+0

我嘗試使用System.gc(); – brian 2011-12-16 03:17:13

+0

麻煩依然存在。 – brian 2011-12-16 03:17:40