while 루프가 있고 해당 루프 내부에 getCharView() 함수 이 호출되어 차트가 만들어집니다. 이 함수에서는 BitmapFactory.decodeResource
이 호출됩니다.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;
}
}
"chart_bg"의 크기는 얼마입니까? –
크기는 '2.72 KB'이며 크기는'537 * 233 '입니다. –
일부 레코드는 잘 삽입되지만 특정 제한 (8 번째 삽입) 이후에는 예외적으로 발생합니다. 각 레코드의 삽입은 차트 레이아웃에 영향을 미치므로 새 비트 맵이 만들어집니다. 따라서 while 루프가 반복됩니다. 루프 중에 외부에 보관하면 오류는 발생하지 않지만 스크롤은 중지됩니다. –