Android 使用 ListView 和位图时出现内存不足错误
Android out of memory error when using ListView and Bitmap
我在我的 ListView 中使用了 ViewHolder + Bitmap decodes/compress 和 imageCache,所以我不会再遇到内存不足错误,但不幸的是我仍然遇到它,它主要发生在我回到我的时候来自另一个 Activity 的 ListView Activity,或者当我从当前的 ListView Activity 转到另一个 ListView Activity 时。
谁能告诉我我是否遗漏了什么?这是我的代码:
private class MyAdapter extends ArrayAdapter<String> {
LruCache<Integer, Bitmap> imageCache;
public MyAdapter(Context context, int resource, int textViewResourceId, String[] strings) {
super(context, resource, textViewResourceId, strings);
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int casheSize = maxMemory / 8;
imageCache = new LruCache<>(casheSize);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolderItem viewHolder;
String[] names = getResources().getStringArray(R.array.grilled_fresh_beef_names);
String[] prices = getResources().getStringArray(R.array.grilled_fresh_beef_prices);
String[] ingredients = getResources().getStringArray(R.array.grilled_fresh_beef_ingredients);
if(convertView==null) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.categories_item, parent, false);
viewHolder = new ViewHolderItem();
viewHolder.item_name = (TextView) convertView.findViewById(R.id.items_name);
viewHolder.item_price = (TextView) convertView.findViewById(R.id.item_price);
viewHolder.item_ingredient = (TextView) convertView.findViewById(R.id.ingredients);
viewHolder.imageView = (ImageView) convertView.findViewById(R.id.item_image);
viewHolder.imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolderItem) convertView.getTag();
}
viewHolder.item_name.setText(names[position]);
viewHolder.item_price.setText(prices[position]);
viewHolder.item_ingredient.setText(ingredients[position]);
Bitmap bitmap = imageCache.get(position);
if (bitmap == null) {
bitmap = BitmapFactory.decodeResource(getResources(), beef_burger[position]);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
imageCache.put(position, bitmap);
}
viewHolder.imageView.setImageBitmap(bitmap);
return convertView;
}
}
我在我的 ListView 中使用了 ViewHolder + Bitmap decodes/compress 和 imageCache,所以我不会再遇到内存不足错误,但不幸的是我仍然遇到它,它主要发生在我回到我的时候来自另一个 Activity 的 ListView Activity,或者当我从当前的 ListView Activity 转到另一个 ListView Activity 时。 谁能告诉我我是否遗漏了什么?这是我的代码:
private class MyAdapter extends ArrayAdapter<String> {
LruCache<Integer, Bitmap> imageCache;
public MyAdapter(Context context, int resource, int textViewResourceId, String[] strings) {
super(context, resource, textViewResourceId, strings);
final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
final int casheSize = maxMemory / 8;
imageCache = new LruCache<>(casheSize);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolderItem viewHolder;
String[] names = getResources().getStringArray(R.array.grilled_fresh_beef_names);
String[] prices = getResources().getStringArray(R.array.grilled_fresh_beef_prices);
String[] ingredients = getResources().getStringArray(R.array.grilled_fresh_beef_ingredients);
if(convertView==null) {
LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.categories_item, parent, false);
viewHolder = new ViewHolderItem();
viewHolder.item_name = (TextView) convertView.findViewById(R.id.items_name);
viewHolder.item_price = (TextView) convertView.findViewById(R.id.item_price);
viewHolder.item_ingredient = (TextView) convertView.findViewById(R.id.ingredients);
viewHolder.imageView = (ImageView) convertView.findViewById(R.id.item_image);
viewHolder.imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolderItem) convertView.getTag();
}
viewHolder.item_name.setText(names[position]);
viewHolder.item_price.setText(prices[position]);
viewHolder.item_ingredient.setText(ingredients[position]);
Bitmap bitmap = imageCache.get(position);
if (bitmap == null) {
bitmap = BitmapFactory.decodeResource(getResources(), beef_burger[position]);
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, bos);
imageCache.put(position, bitmap);
}
viewHolder.imageView.setImageBitmap(bitmap);
return convertView;
}
}