Bitmap 쓰다보니 모르고, 궁금한게 많이 생기네요..
이미지로딩 관련 라이브러리 쓰라고 하셔서 라이브러리 쓰기전 최대한
원인 이해를 하고 싶어 질문 드립니다.
아래와 같이 2가지의 소스 코드가 있습니다.
1번, 2번은 각각 독립 액티비티이고 다른 액티비티에서 호출 하는 형태입니다.
1번, 2번 액티비티는 해당 작업 완료 후 finish() 됩니다.
1.
Bitmap bm = Bitmap.createBitmap(1280, 1800, Bitmap.Config.ARGB_8888);
bm.compress(Bitmap.CompressFormat.JPEG, 100, out);
2.
Bitmap bm = Bitmap.createBitmap(1280, 1800, Bitmap.Config.ARGB_8888);
ImageView iv = new ImageView(context);
iv.setImageBitmap(bm);
여기서 다른 액티비티에서 1번 액티비티는 반복해서 몇번을 호출해도 문제없이
실행이 됩니다.
그치만 2번 액티비티는 반복해서 5번 이상 호출시 OOM이 발생 합니다.
제 짧은 지식으로 이해하자면,
2번 액티비티에서는 ImageView에서 비트맵을
참조 하고 있기 때문에 메모리에 계속 남는다
그리고 2번 액티비티를 finish()해도 바로 ImageView에서 참조중인 Bitmap의
메모리가 반환되지 않기 때문에 반복해서 호출시 OOM이 발생한다.
이렇게 이해 하면 되는건가요..?
그리고 이 문제는 외부 라리브러리를 사용하지 않으면 해결하기 힘든 문제 인가요..?
전체 코드도 추가합니다.
public class CreateFormatActivity extends ActivityHelper implements View.OnTouchListener {
private final double A4_RATIO = 1.4151260504f;
private final double SCREEN_RATIO = 0.65f;
// Activity
private LinearLayout preView = null;
private String pdfPath = "";
// **********************************************************************
// Override
// **********************************************************************
@Override
protected void activityStart(Bundle savedInstanceState) throws Exception {
setContentView(R.layout.activity_format_preview);
findViewById(R.id.closeBtn).setOnTouchListener(this);
findViewById(R.id.printBtn).setOnTouchListener(this);
preView = (LinearLayout) findViewById(R.id.previewList);
createFormatAndPreview();
}
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
if (motionEvent.getAction() == MotionEvent.ACTION_UP) {
switch (view.getId()) {
case R.id.closeBtn :
finish();
break;
case R.id.printBtn :
try {
File pdfFile = new File(pdfPath);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.fromFile(pdfFile), "application/pdf");
startActivity(intent);
} catch (Exception e) {
//
}
break;
default:
;
}
}
return false;
}
// **********************************************************************
// private method
// **********************************************************************
private void createFormatAndPreview() {
WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
Display display = manager.getDefaultDisplay();
Point theScreenResolution = new Point();
display.getSize(theScreenResolution);
//int basePreviewWidth = (int) (theScreenResolution.x * SCREEN_RATIO);
//int basePreviewHeight = (int) (basePreviewWidth * A4_RATIO);
//int basePreviewWidth = (int) A4.PORTRAIT[0];
//int basePreviewHeight = (int) A4.PORTRAIT[1];
int basePreviewWidth = 1280;
int basePreviewHeight = (int) (basePreviewWidth * A4_RATIO);
float sRatio = basePreviewWidth / A4.PORTRAIT[0];
LogUtil.d(String.format("basePreviewWidth : %s - basePreviewHeight : %s", basePreviewWidth, basePreviewHeight));
LogUtil.d("sRatio : " + sRatio);
Bitmap draw_bitmap = Bitmap.createBitmap(basePreviewWidth, basePreviewHeight, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(draw_bitmap);
canvas.drawColor(Color.WHITE);
Paint paintFillBlack = new Paint();
paintFillBlack.setTextSize(20f * sRatio);
paintFillBlack.setColor(Color.BLACK);
paintFillBlack.setStyle(Paint.Style.FILL_AND_STROKE);
paintFillBlack.setAntiAlias(true);
Paint paintStrokeBlack = new Paint();
paintStrokeBlack.setTextSize(20f * sRatio);
paintStrokeBlack.setColor(Color.BLACK);
paintStrokeBlack.setStyle(Paint.Style.STROKE);
/*
create format
*/
ArrayList<Map<String, String>> rows = new ArrayList<Map<String, String>>();
int pageNumber = 1;
int rowIndex = 0;
String filePath = globals.getLocalPdfWorkDirPath();
String fileFullPath = filePath + "DtcPrintPreview";
while (true) {
// 캔버스로 비트맵에 내용 그림 부분 생략
// 프리뷰
try {
FileOutputStream out = new FileOutputStream(fileFullPath + pageNumber + ".jpg");
draw_bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
int preViewWidth = theScreenResolution.x / 2;
int preViewHeight = (int) (preViewWidth * A4_RATIO);
ImageView imageView = new ImageView(context);
imageView.setImageBitmap(orgImage);
imageView.setPadding(10, 10, 10, 10);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setLayoutParams(new LinearLayout.LayoutParams(preViewWidth, preViewHeight));
preView.addView(imageView);
} catch (Exception e) {
e.printStackTrace();
}
if (rowIndex == rows.size()) {
break;
} else {
++pageNumber;
//5회 이상 실행시 OOM발생
draw_bitmap = Bitmap.createBitmap(basePreviewWidth, basePreviewHeight, Bitmap.Config.ARGB_8888);
canvas = new Canvas(draw_bitmap);
canvas.drawColor(Color.WHITE);
}
}
PdfUtil pdfUtil = new PdfUtil(PrintFromDiagActivity.this);
pdfPath = pdfUtil.createImageToPDF(filePath, "PORTRAIT", 1);
}
}
다들 답변 감사합니다.
많이 배워갑니다..