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

BitmapFactory 처리시 오류 질문드립니다.

0 추천
                    selectedImage = BitmapFactory.decodeFile(filePath);
                    round_img = RoundedAvatarDrawable.getRoundedCornerBitmap(selectedImage); //이미지를 라운드 처리한다.
                    _image = (ImageView) mThisView.findViewById(R.id.main_profile_img);
                    _image.setImageBitmap(round_img);

현재 sd card에서 이미지를 불러온다음 라운드 처리 후 이미지뷰에 뿌려주고 있습니다.

그리고 앱이 종료되면 

    @Override
    public void onDestroy() {
    	// TODO Auto-generated method stub
    	super.onDestroy();

    	//비트맵 이미지 반환
    	recycleBitmap(_image);
    }

Destroy에서 G.C 해지하고 있구요

 

recycleBitmap 은 

    private static void recycleBitmap(ImageView iv) {
        Drawable d = iv.getDrawable();
        if (d instanceof BitmapDrawable) {
            Bitmap b = ((BitmapDrawable)d).getBitmap();
            b.recycle();
        }
         
        d.setCallback(null);
    }

와 같이 구성하였습니다.

 

일부 단말에서 계속 오류가 발생합니다

현재 프레그먼트 형식으로 되어있는데 맨마지막 페이저까지 가면 Binary XML file line #2: Error inflating class <unknown>이 뜹니다;;(특히 4.0.3,4.0.4 에서요)

 

그리고 간혈적으로 앱을 재실행할때 앱이 죽습니다..

오류는  "Cannot draw recycled bitmaps" 오류가 뜹니다 특히 4.3에서 많이 발생하네요..

 

좀더 좋은 방법이 있다면 조언 부탁드리겠습니다..

하늘아륑 (16,800 포인트) 님이 2014년 1월 22일 질문
하늘아륑님이 2014년 1월 22일 수정

1개의 답변

0 추천
 
채택된 답변

"Cannot draw recycled bitmaps" 에러는 recycle 관련해서 발생하는 것이라고 하네요. 먼저 위의 recycleBitmap 메소드를 주석처리해서 테스트해보세요. recycle은 인위적으로 하지 않는 것이 좋다고 하네요. 안드로이드가 알아서 처리하니까요.

Binary XML file line #2: Error inflating class <unknown> 오류 같은 경우 관련된 xml 레이아웃 파일의 2번째 줄에 어떤 코드가 있는지 알아야 겠네요. 혹시 이미지가 커서 out of memory와 관련된 에러일수도 있다고 합니다.

 

여기를 참고해보세요.

 

http://stackoverflow.com/questions/12218976/cannot-draw-recycled-bitmaps-when-displaying-bitmaps-in-gallery-attached-to-ad

 

방귀과장 (18,940 포인트) 님이 2014년 1월 22일 답변
하늘아륑님이 2014년 12월 5일 채택됨
답변감사드립니다.
먼저 recycle(); 처리를 하지 않으면 앱을 재실행할때 OOM오류가 발생하여 처리해주었습니다.
BitmapFactory.decodeFile 로 처리할경우에 해제를 해줘야 하더라구요

두번째로
View mainView = (View) inflater.inflate(R.layout.love_tip_layout_info, container, false);
이렇게 선언 되어있습니다
이게 웃긴게 어느기기에서는 잘되고 어느기기에서는 또 안됩니다
저 리소스 안에 텍스타와 버튼말고 이미지는 없습니다..

하위버전 호화성 맞추기란 역시 머리가 아프군요...
out of memory 오류는 BitmapFactory.Options의 inSampleSize로 처리할 수 있어요. 제가 제안드린대로 recyle 메소드를 주석처리해서 결과가 어떤지 보는 것도 좋을 것같네요.

love_tip_layout_info 레이아웃 파일의 2번째 행에 코드가 어떻게 되나요?
레이아웃 파일의 2행은 아래처럼 되어 있습니다.
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

전체 소스는
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <Button
            android:id="@+id/love_tip_start_btn"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:onClick="onColorClicked2"
            android:background="@drawable/button_red_selector"
            android:textColor="#FFFFFF"
            android:layout_marginBottom="20dp"
            android:text="@string/start" />

    </RelativeLayout>
</LinearLayout>
입니다.

그리고 recyle메소드를 주석처리하면 현재 제가 4.4를 사용중인데 4.4에서는 멀쩡합니다. 그런데 4.0 이하로만 내려가면 1~20번중 한번꼴로 캔버스 오류로 죽습니다.. 그 오류 잡으려고 recycle(); 를 넣어주었거든요ㅠ
전체 소스를 봐야 할 것 같은데. 보안상 안되겠죠? 잘 해결하시길 바랄께요.
구조를 다시 짜서 해결하긴 했습니다.
근데 가끔 4.3 버전에서 오류가 올라오는데 테스트할때는 오류가 안나는데 흠;;
...