1

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;
}
}
4

1 に答える 1