我有一個包含圖像圖標(存儲在drawables文件夾中)的70個文本項目的列表。 如果我第一次啓動應用程序並緩慢滾動列表 - 不會發生異常。滾動圖像列表時出現OutOfMemory異常
當應用程序被啓動的第一時間,我滾動與「甩」動作列表中出現以下異常:
java.lang.OutOfMemoryError: bitmap size exceeds VM budget
at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:439)
at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:322)
at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:688)
at android.content.res.Resources.loadDrawable(Resources.java:1710)
at android.content.res.Resources.getDrawable(Resources.java:585)
之後,如果我殺死DDMS的應用程序,再次和滾動啓動它與'一擲'動作,異常不會發生。因此,只有在第一次安裝和啓動應用程序時纔會出現異常情況。
這裏是我使用的列表中選擇適配器:
public class AuthorAdapter extends ArrayAdapter<Author> {
private ArrayList<Author> items;
private Context context;
private LayoutInflater inflater;
public AuthorAdapter(Context context, int textViewResourceId, ArrayList<Author> items) {
super(context, textViewResourceId, items);
this.items = items;
this.context = context;
inflater = LayoutInflater.from(this.context);
}
static class ViewHolder {
ImageView authorFace;
TextView authorName;
TextView authorWho;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = inflater.inflate(R.layout.autor_data, null);
holder = new ViewHolder();
holder.authorFace = (ImageView) convertView.findViewById(R.id.authorFaceImageView);
holder.authorName = (TextView) convertView.findViewById(R.id.authorNameTextView);
holder.authorWho = (TextView) convertView.findViewById(R.id.authorWhoTextView);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
Author author = items.get(position);
if (author != null) {
if (holder.authorFace != null) {
String faceFileName = author.getFace();
String facePlaceName = context.getPackageName() + ":drawable/" + faceFileName.subSequence(0, faceFileName.lastIndexOf("."));
int faceFileId = context.getResources().getIdentifier(facePlaceName, null, null);
holder.authorFace.setImageResource(faceFileId);
}
if (holder.authorName != null) {
holder.authorName.setText(author.getName());
}
if (holder.authorWho != null) {
holder.authorWho.setText(author.getWho());
}
}
return convertView;
}
}
有沒有辦法避免的異常? 我應該捕捉異常並以某種方式逃離內存嗎?
任何建議如何做到這一點?
謝謝。
您的圖片有多大 – 2010-01-15 15:01:46
列表項圖片大小約爲3KB。我使用兩個活動(主要和列表)。活動背景圖像每個大約60KB。還有我用於UI控件的圖像,總共大約100 KB。它可能是一個模擬器問題? 不幸的是,我現在無法在設備上試用我的應用程序。 – Zzokk 2010-01-18 07:09:50