Android

[Kotlin] ImageView ์™€ Memery leak (Bitmap ์‚ฌ์šฉ์‹œ)

MK_____ 2023. 6. 12. 14:58

์•ˆ๋“œ๋กœ์—๋“œ์—์„œ ์ด๋ฏธ์ง€๋ทฐ์— ์ด๋ฏธ์ง€๋ฅผ Setting ํ•  ๋•Œ, ์ฃผ๋กœ ๋‹ค์Œ์˜ ํ•จ์ˆ˜๋“ค์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

setImageDrawable(...),  setImageResource(...),  setImageBitmap(...)

 

๊ทธ๋Ÿผ ์•„๋ž˜์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์ด๋ฏธ์ง€๋ทฐ์— ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๊ฐ€ ํ• ๋‹น๋˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

 while(true){
 Bitmap newBitmap = BitmapFactory.decodeStream(...);
 imageView.setImageBitmap(newBitmap );
}

 

 

์œ„ ์ฝ”๋“œ์—์„œ imageView๋Š” ๊ณ„์†ํ•ด์„œ ์ƒˆ๋กœ์šด newBitmap์„ ํ• ๋‹นํ•˜๊ณ  ๊ธฐ์กด์˜ bitmap์€ leak์„ ๋ฐœ์ƒ์‹œํ‚ฌ ๊ฒƒ์ด๋‹ค. ๊ฒฐ๊ตญ์—๋Š” outofmemory exception์ด ๋ฐœ์ƒํ•  ๊ฒƒ์ด๋‹ค. ์œ„์˜ ์ฝ”๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ˆ˜์ •ํ•˜๋ฉด leak์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

 while(true){
Bitmap newBitmap = BitmapFactory.decodeStream(...);
imageView.setImageBitmap(newBitmap );
newBitmap.recycle();
}

 

 

์œ„์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ bitmap์„ ์ƒ์„ฑํ•˜์—ฌ ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐœ๊ฒฌํ•˜๊ธฐ๊ฐ€ ์‰ฝ๋‹ค. ํ•˜์ง€๋งŒ, ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ๋ณด์ž.

 while(true){
imageView.setImageDrawable(newDrawable);
// or imageView.setImageResource(newResource); 

}

 

 

์œ„์˜ ์ฝ”๋“œ์—์„œ ์šฐ๋ฆฌ๋Š” ์ง์ ‘์ ์œผ๋กœ bitmap์„ ์ƒ์„ฑํ•˜์ง€ ์•Š์•˜์ง€๋งŒ, ์ด ๊ฒฝ์šฐ์—๋„ memory leak์ด ๋ฐœ์ƒํ•œ๋‹ค.

์ด๋Š” drawable์ด๋‚˜ resource ๋˜ํ•œ ๋‚ด๋ถ€์ ์œผ๋กœ bitmap์„ ์ƒ์„ฑํ•˜์—ฌ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 while(true){
imageView.setImageDrawable(newDrawable);
// or imageView.setImageResource(newResource);

Drawable d = imageView.getDrawable();
if (d instanceof BitmapDrawable) {
Bitmap bm = ((BitmapDrawable) d).getBitmap();
if (bm != null)
bm.recycle();
}
imageView.setImageDrawable(null);
}

 

 

* ์œ„์™€ ๊ฐ™์€ ์ฒ˜๋ฆฌ๋Š” ImageView์—์„œ ์ž์ฒด์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์ค„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ ˆ๋Œ€(!) ํ•ด์ฃผ์ง€ ์•Š๋Š”๋‹ค...ํ•ญ์ƒ ์ฃผ์˜ํ•ด์„œ ์‚ฌ์šฉํ•˜์ž.

  

 

BitmapDrawable d = (BitmapDrawable)((ImageView) findViewById(R.id.๋ทฐ์ด๋ฆ„)).getDrawable();

Bitmap b = d.getBitmap();

 Bitmapํ˜•์‹์˜ b๋กœ ๋ฐ›์•„์˜จ๋‹ค.

 

 

์ถœ์ฒ˜: https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=jasoy&logNo=110148406111