2013-06-07 4 views
1

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; 
} 
} 
+0

"chart_bg"의 크기는 얼마입니까? –

+0

크기는 '2.72 KB'이며 크기는'537 * 233 '입니다. –

+0

일부 레코드는 잘 삽입되지만 특정 제한 (8 번째 삽입) 이후에는 예외적으로 발생합니다. 각 레코드의 삽입은 차트 레이아웃에 영향을 미치므로 새 비트 맵이 만들어집니다. 따라서 while 루프가 반복됩니다. 루프 중에 외부에 보관하면 오류는 발생하지 않지만 스크롤은 중지됩니다. –

답변

0

안드로이드 장치가 심각한 메모리 제한이있을 수 있습니다. 이를 극복하려면 비트 맵의 ​​크기를 제한해야합니다. 당신이해야 할 일은 볼 수있는 디스플레이만큼 큰 비트 맵을 유지하는 것입니다. 사용자가 스크롤 할 때 새로운 비트 맵을 생성하는 대신 비트 맵을 업데이트하십시오.

+0

새로운 비트 맵을 생성하는'decodeResource.copy'를 사용하고 있습니다. 어떻게 업데이트 할 수 있습니까? 일부 레코드는 잘 삽입되지만 특정 제한 (8 번째 삽입) 이후에는 예외적으로 발생합니다. 각 레코드의 삽입은 차트 레이아웃에 영향을 미치므로 새 비트 맵이 만들어집니다. 따라서 while 루프가 반복됩니다. 루프 중에 외부에 보관하면 오류는 발생하지 않지만 스크롤은 중지됩니다. –

관련 문제