[Kotlin] ImageView ์ Memery leak (Bitmap ์ฌ์ฉ์)
์๋๋ก์๋์์ ์ด๋ฏธ์ง๋ทฐ์ ์ด๋ฏธ์ง๋ฅผ 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์์ ์์ฒด์ ์ผ๋ก ์ฒ๋ฆฌํด์ค ๊ฒ ๊ฐ์ง๋ง ์ ๋(!) ํด์ฃผ์ง ์๋๋ค...ํญ์ ์ฃผ์ํด์ ์ฌ์ฉํ์.
ImageView์ ์ฌ์ง์ Bitmap์ผ๋ก ๊ฐ์ ธ์ค๊ธฐ
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