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

서버에서 bitmap받는 도중 outOfMemorryError질문

0 추천

서버에서 요청해서 비트맵을 약 30개정도 받아옵니다. 

항상은 아니고.. 가끔씩..  아웃오브메모리에러가 나네요. 

 

bitmap = BitmapFactory.decodeStream(input); 

이부분에서 에러가 나는 것 같네요..

 

어떤식으로 고칠 수 있을까요.?

getBitmap() 매서드는 thread의 run()안에서 돌아갑니다. 

 

private void getBitmap(){
    HttpURLConnection conn;
    Bitmap bitmap;
    BibleInfo_FromServer cur_bible;
    Iterator<BibleInfo_FromServer> it = ul.iterator();
    // URL_ArrayList 하나하나에 대해서 반복문에서 http연결을 하고 bitmap을 가져옴.
    int i=0;
    while(it.hasNext()) {

        try {
            //url제공.
            cur_bible = it.next();
            URL url = new URL(cur_bible.picture);

           
            conn = (HttpURLConnection)url.openConnection();
            conn.setDoInput(true);
            conn.connect();

            InputStream input = conn.getInputStream();
            bitmap = BitmapFactory.decodeStream(input);


            //가져온 Bitmap들을 Bitmap_ArrayList에 저장함.
            cur_bible.bitmap = bitmap;

            //스토어를 클릭했을 때, 상세이미지도 받아내는 곳.
            if(is_store_clicked.equals("true")){

                //picture에 _01 붙이기 (상세이미지 url)
                String picture = cur_bible.picture;
                picture = picture.replace(".Jpeg","_01.Jpeg");

                URL url1 = new URL(picture);

                //    Log.d("메시지", "url 얻는 부분에서 cur_bible.picture = "+ cur_bible.picture);
                conn = (HttpURLConnection)url1.openConnection();
                conn.setDoInput(true);
                conn.connect();
                InputStream input1 = conn.getInputStream();
                bitmap = BitmapFactory.decodeStream(input1);

                //상세이미지 비트맵 저장
                //상세이미지는 사이즈를 조절해서 저장함.
                cur_bible.bitmap_detail_image = resizeBitmapImage(bitmap, 4050);
                Log.d("메시지","변환 후 비트맵 : "+cur_bible.bitmap_detail_image);

            }

 

로그입니다. 

 

E/AndroidRuntime: FATAL EXCEPTION: Thread-6741
                  Process: com.example.pc., PID: 6209
                  java.lang.OutOfMemoryError: Failed to allocate a 1440012 byte allocation with 1178560 free bytes and 1150KB until OOM
                      at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
                      at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
                      at android.graphics.BitmapFactory.decodeStreamInternal(BitmapFactory.java:752)
                      at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:728)
                      at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:766)
                      at .myapp.Bitmap_GetFromURL.getBitmap(Bitmap_GetFromURL.java:56)
                      at myapp.Bitmap_GetFromURL.run(Bitmap_GetFromURL.java:33)

 

익명사용자 님이 2016년 10월 27일 질문

2개의 답변

0 추천
비트맵을 30개나 메모리에 올려야 하는 이유가 있나요?

10개씩만 가져오시고 10개 다 차면 10개는 파일에 저장하고 다시 10개를 가져오시고 하는 방법으로 해보세요.

메모리에 전부 올리는건 필연적으로 아웃오브메모리 나요.
갸아악 (21,260 포인트) 님이 2016년 10월 27일 답변
0 추천
Heap메모리에서 OEM이 나는것인데..

일단 매니패스트에서 라지힙 옵션 주고 해보세요..

그런데 현재 로직에서 30개를 메모리에 다 올리는 로직은 변경하시는걸 추천드립니다.
갸아악 (21,260 포인트) 님이 2016년 10월 27일 답변
...