我使用GridView显示MediaStore的缩略图。 如果我启动并关闭我的应用程序2-3次,它会崩溃 记忆错误。 System.gc()在主要活动的onCreate中调用。 如果注释调用setImageURI则没有错误。 也许我需要以某种方式明确地清除记忆? 请帮忙。
public View getView(int position, View convertView, ViewGroup parent){
ImageView i;
if (convertView == null) {
i = new ImageView(activity.getApplicationContext());
i.setLayoutParams(new GridView.LayoutParams(92, 92));
i.setScaleType(ImageView.ScaleType.CENTER_CROP);
} else {
i = (ImageView) convertView;
}
Uri imageUri = thumbUri(position);
i.setImageURI(imageUri); // <--- no error if this string is commented
return i;
}
答案 0 :(得分:4)
我明白了。我的解决方案基于Francesco回答,但onPause而不是onDestroy。
@Override
protected void onPause() {
GridView gridView = (GridView) findViewById(R.id.public_photos);
int count = gridView.getCount();
for (int i = 0; i < count; i++) {
ImageView v = (ImageView) gridView.getChildAt(i);
if (v != null) {
if (v.getDrawable() != null) v.getDrawable().setCallback(null);
}
}
super.onPause();
}
答案 1 :(得分:3)
你好像在其他地方泄露记忆。 尝试从ImageView中删除所有回调,如下所示:
@Override
protected void onDestroy(){
super.onDestroy();
int count = gridView.getCount();
for (int i = 0; i < count; i++){
final ImageView v = (ImageView) gridView.getChildAt(i);
v.getDrawable().setCallback(null);
}
}