BitmapFactory.decodeResource出现内存不足错误

时间:2013-06-07 10:11:40

标签: android bitmap out-of-memory

有一个while循环,在该循环内部有一个函数getCharView()的调用 这会创建图表。在此函数中,调用BitmapFactory.decodeResource

插入少量记录很好但是如果我尝试在我的真实设备上插入第8条记录, 出现内存不足错误,应用程序崩溃。

我理解它是因为BitmapFactory.decodeResource在循环中被调用 每次等位图尺寸都在增加,这导致某些点崩溃。

如果我将代码 - cv = new ChartView();linearLayoutMap.put(date, cv.getChartView());views.add(cv.getChartView());放在循环之外,那么应用程序不会崩溃,但是位图的滚动会停止。

在多次记录插入后,可以做些什么来阻止崩溃并使滚动工作没有崩溃?

我的相关代码:

Calendar scal = Calendar.getInstance();
scal.setTime(stDate);

Calendar cal = Calendar.getInstance();

while (scal.compareTo(cal) < 0) {

//some more lines of code.....

cv = new ChartView();
linearLayoutMap.put(date, cv.getChartView());
views.add(cv.getChartView());
}


public class ChartView {
private Paint cPaint;


public LinearLayout getChartView() {

    getActivity().runOnUiThread(new Runnable() {

        @Override
        public void run() {

newBitmap = BitmapFactory.decodeResource(
getResources(), R.drawable.chart_bg).copy(
Bitmap.Config.ARGB_4444, true);

canvas = new Canvas(newBitmap);
img.setImageBitmap(newBitmap);
img.setScaleType(ScaleType.FIT_XY);
float wFactor = (15 * scale);
float hFactor = (float) ((19.35) * scale);
float x1 = startHours * wFactor;
float x2 = endHours * wFactor;
float y1 = (2 * startHeight - 1) * hFactor;
float y2 = (2 * endHeight - 1) * hFactor;

canvas.drawLine(x1, y1, x2, y2, cPaint);
canvas.save(Canvas.ALL_SAVE_FLAG);
linearlayout.addView(img);
}
});
return linearlayout;
}
}

1 个答案:

答案 0 :(得分:0)

Android设备可能存在严重的内存限制。要解决此问题,您需要限制位图的大小。您需要做的是保持位图与可视显示一样大,而不是更大。当您的用户滚动时,请更新位图而不是创建新的位图。