我讨厌发布多余的问题,但我不能为我的生活找出如何在堆上没有太多的Bitmap内存。它在第一次onCreate时完全膨胀,但第二次失败。我何时/何时回收这些东西,@ _ lol
我基本上使用位图的数组列表,将其设置为具有自定义行布局的适配器,覆盖getView。
**正在使用的位图是来自SD卡的jpeg //基本上是垂直滚动的图库。
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
setListAdapter(getAdapter());
}//on create
private ArrayAdapter<Bitmap> getAdapter(){
ArrayList<Bitmap> picsII = new ArrayList<Bitmap>();
String DIRECTORY_PATH = "/sdcard/Mustaches/";
File file = new File(DIRECTORY_PATH);
final String[] s = file.list();
for(int i = 0; i<s.length; i++){
Bitmap b = BitmapFactory.decodeFile(DIRECTORY_PATH + s[i]);
picsII.add(b);
}
adapter = new ArrayAdapter<Bitmap>(this, R.layout.row, picsII){
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row;
if (null == convertView) {
row = mInflater.inflate(R.layout.row, null);
} else {
row = convertView;
}
ImageView iv = (ImageView) row.findViewById(R.id.imageView_row);
iv.setImageBitmap(getItem(position));
//some other widgets such as buttons and textviews
//from the custom row are inflated here
return row;
}
};
return adapter;
};
答案 0 :(得分:1)
您的问题是,当您可能一次只显示一对位图时,您正急切地加载所有位图。
在显示任何位图之前,您将所有位图解码为数组。这很容易耗尽你的所有记忆。
您要使用的方法只是加载正在显示的ListView
行的图像。
请查看本文以获得更好的解决方案,其中包括在后台线程中加载图像并维护缓存。
http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html