마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

Bitmap에서 OutofMemory가 발생합니다

0 추천

아래와 같이 이미지를 이미지뷰에 설정해봣습니다

한번에 약 100번을 루프를 돕니다

=====================================================

class AccumulateTask extends AsyncTask<Integer, Integer, Integer> {
protected void onPreExecute() {
 
}
 
protected Integer doInBackground(Integer... params) {
        try{
        int id = params[0];
        int listPos = params[1];
        String imagePath =  CommonUtilities.SEVER_URL+"/seouleTollet/images/"+ temp_imgpath[id];
        /// Log.i("AccumulateTask", "id = "+id + " == "+imagePath+ " == "+FNAME[id]);
       
        BitmapFactory.Options resizeOpts = new Options();
        resizeOpts.inSampleSize = 4;
        resizeOpts.inJustDecodeBounds = false;
        resizeOpts.inPurgeable = true;
        InputStream is = new URL(imagePath).openStream();
        Bitmap bit = BitmapFactory.decodeStream(is,null, resizeOpts);
//     PensionListItem  Item = (PensionListItem)pensionItem.get(id);
    PensionListItem  Item = (PensionListItem)pensionItem.get(listPos);
    Item.setMyImg(bit);
    pensionList.notifyAll();
    bit = null;
    is.close();
    //resizeOpts =  null;
       
        }catch(Exception e){
        }
return 0;
}
   protected void onProgressUpdate(Integer... progress) {         
    //dialog.progressDialogClose();
   }
   
   protected void onPostExecute(Integer result) { 
   
   }
   
   protected void onCancelled() {
//dialog.progressDialogClose();
 
   }
 
}
약600번을 돌리면 OutOfMemory가 발생합니다

bitmap.recycle();

bitmap = null;

이렇게도 해봤는데도 에러가 발생해서 어플이 죽습니다

도대체 어떻게 해야하나요?

 

헨씀히포 (3,660 포인트) 님이 2014년 9월 4일 질문

2개의 답변

0 추천
 
채택된 답변
bit = null; 을 해줬지만
 
그 앞에 Item.setMyImg(bit);를 했으니 bit는 아직 묶인 몸이죠 
 
가비지컬렉팅이 안될겁니다
 
그러니 OutOfMemory가 발생되겠죠
 
그리고 recycle을 불렀을 때 난 에러는 저 아이템이 사용될 때 리사이클된 비트맵을 사용했다는 에러였을거 같네요
 
alkyne (22,960 포인트) 님이 2014년 9월 5일 답변
헨씀히포님이 2014년 9월 9일 채택됨
0 추천
버전에 따라 recycle()이 잘 먹히는 경우가 있고, 그렇지 않는 경우도 있습니다.

그래서 recycle()후 참조 변수를 전부 null로 변경하라고 많이 하는데요.

bitmap = null 코드에서 bitmap이 어디의 참조 변수인지는 잘 모르겠으나,

이미지를 설정한 뷰의 background를 고려안하셨을 가능성이 높네요.

이미지를 설정한 뷰의 bacground도 null로 설정해보세요.
Jinthree (8,980 포인트) 님이 2014년 9월 5일 답변
정말 답변 고맙습니다!!
...