让我们看看如何解释这个问题。我有4个活动和1个布局。布局包含图像切换器和图库。这些活动将显示我在Integer数组中的不同图像。所有这些图像都在drawable文件夹中。当我启动应用程序一切都很好我可以在活动之间切换但是一段时间后我滚动画廊时出现内存不足异常。我不知道如何解决这个问题,因为我不知道从哪里开始看,没有堆栈跟踪。我唯一得到的是:
03-16 15:46:50.367: ERROR/dalvikvm-heap(23389): 847992-byte external allocation too large for this process.
03-16 15:46:50.367: ERROR/dalvikvm(23389): Out of memory: Heap Size=5255KB, Allocated=2833KB, Bitmap Size=18900KB
03-16 15:46:50.367: ERROR/GraphicsJNI(23389): VM won't let us allocate 847992 bytes
这是我正在使用的代码:
private ImageSwitcher mSwitcher;
private Integer[] mThumbIds = {drawables here...};
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mSwitcher = (ImageSwitcher) findViewById(R.id.switcher);
mSwitcher.setFactory(this);
mSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_in));
mSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, android.R.anim.fade_out));
Gallery g = (Gallery) findViewById(R.id.gallery);
g.setAdapter(new BasicsAdapter(getApplicationContext(), mThumbIds));
g.setOnItemSelectedListener(this);
}
public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
mSwitcher.setImageResource(mThumbIds[position]);
}
public void onNothingSelected(AdapterView<?> parent) {
}
public View makeView() {
ImageView i = new ImageView(this);
i.setBackgroundColor(0xFF000000);
i.setScaleType(ImageView.ScaleType.FIT_CENTER);
i.setLayoutParams(new ImageSwitcher.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
return i;
}
这是我的适配器类:
public View getView(int position, View convertView, ViewGroup parent) {
ImageView i = new ImageView(mContext);
i.setImageResource(mThumbIds[position]);
i.setAdjustViewBounds(true);
i.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
i.setBackgroundResource(R.drawable.i);
return i;
}
我不知道如何清理堆,也不知道前一个活动的drawable是否仍在内存中。我该如何解决这个问题?
提前致谢。
答案 0 :(得分:0)
每次查看不同的图像时都会创建一个新的ImageView,因此内存不足。 getView方法需要使用循环视图。
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView == null) { // create new view
convertView = new ImageView(mContext);
convertView.setAdjustViewBounds(true);
convertView.setLayoutParams(new Gallery.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
convertView.setBackgroundResource(R.drawable.i);
}
ImageView iv = (ImageView) convertView;
iv.setImageResource(mThumbIds[position]);
return convertView;
}