Android 가 그림 을 처리 할 때 OOM 이 나타 나 는 방식 을 줄 입 니 다.

안 드 로 이 드 사진 프로그램 을 할 때 사진 이 많아 서 OOM 이 나 올 기회 가 많 습 니 다.인터넷 자료 에 따라 정 리 를 했 는데 OOM 이 나 올 기 회 를 줄 일 수 있 기 를 기대 합 니 다.
1.자바 층 을 사용 하 는 방법 대신 바 텀 방법 을 사용한다.
     되도록 setImageBitmap 이나 setImageResource 나 BitmapFactory.decodeResource 를 사용 하여 큰 그림 을 설정 하지 마 십시오. 
 이 함수 들 은 decode 를 완성 한 후에 최종 적 으로 자바 층 의 createBitmap 을 통 해 이 루어 지기 때문에 더 많은 메모 리 를 소모 해 야 합 니 다.따라서 BitmapFactory.decodeStream 방법 을 통 해 bitmap 를 만 든 다음 ImageView 의 source 로 설정 합 니 다. 
decodeStream 의 가장 큰 비밀 은 JNI>nativeDecodeAsset()를 직접 호출 하여 decode 를 완성 하 는 것 입 니 다.자바 층 의 createBitmap 를 사용 하지 않 아 도 자바 층 의 공간 을 절약 할 수 있 습 니 다. 
 읽 을 때 그림 의 Config 인 자 를 추가 하면 불 러 오 는 메모 리 를 효과적으로 줄 일 수 있 습 니 다.
 이러한 방법 을 사용 하면 out of Memory 이상 을 더욱 효과적으로 막 을 수 있 습 니 다.또한 decodeStream 이 직접 가 져 온 그림 으로 바이트 코드 를 읽 을 수 있 습 니 다.기계 의 각종 해상도 에 따라 자동 으로 적응 하지 않 습 니 다.decodeStream 을 사용 한 후에 hdpi 와 mdpi,ldpi 에 해당 하 는 그림 자원 을 설정 해 야 합 니 다.그렇지 않 으 면 해상도 기기 에 똑 같은 크기(픽 셀 포인트 수량)로 표시 되 는 크기 가 맞지 않 습 니 다.또한 다음 과 같은 방식 도 큰 도움 이 된다.
세 션 1: 
InputStream is = this.getResources().openRawResource(R.drawable.pic1); 
     BitmapFactory.Options options=new BitmapFactory.Options(); 
     options.inJustDecodeBounds = false; 
     options.inSampleSize = 10;   //width,hight         
     Bitmap btp =BitmapFactory.decodeStream(is,null,options); 

세 션 2:
if(!bmp.isRecycle() ){ 
         bmp.recycle()   //          
         system.gc()  //         
} 

세 션 3:
public static Bitmap readBitMap(Context context, int resId){  
     BitmapFactory.Options opt = new BitmapFactory.Options();  
         opt.inPreferredConfig = Bitmap.Config.RGB_565;   
       opt.inPurgeable = true;  
       opt.inInputShareable = true;   
      InputStream is = context.getResources().openRawResource(resId);  
        return BitmapFactory.decodeStream(is,null,opt);  
  } 

2.가상 컴퓨터 의 메모리 사용 최적화
안 드 로 이 드 플랫폼 의 경우 위탁 관리 층 이 사용 하 는 Dalvik Java VM 은 현재 의 표현 을 보면 최적화 처 리 를 할 수 있 는 곳 이 많다.예 를 들 어 우 리 는 대형 게임 이나 자원 을 소모 하 는 응용 프로그램 을 개발 할 때 GC 처리 에 수 동 으로 간섭 하 는 것 을 고려 할 수 있 고 dalvik.system.VMRuntime 류 가 제공 하 는 setTargetHeap Utilitization 방법 을 사용 하면 프로그램 메모리 의 처리 효율 을 강화 할 수 있다.물론 구체 적 인 원 리 는 개원 공 사 를 참고 할 수 있 습 니 다.여기 서 사용 방법 만 말씀 드 리 겠 습 니 다. 
  private final static float TARGET_HEAP_UTILIZATION = 0.75f; 
프로그램 onCreate 에서 VMRuntime.getRuntime().setTargetHeapUtilitization(TARGETHEAP_UTILIZATION); 됐다. 
Android 메모리 도 스스로 크기 를 정의 할 수 있 습 니 다. 
    일부 안 드 로 이 드 프로젝트 에 있어 성능 병목 에 영향 을 주 는 것 은 주로 안 드 로 이 드 자체 의 메모리 관리 체제 문제 이다.현재 핸드폰 업 체 들 은 RAM 에 대해 모두 인색 하 다.소프트웨어 의 유창 성에 있어 RAM 은 성능 에 대한 영향 이 매우 민감 하 다.Dalvik 가상 기기 의 메모리 분 배 를 최적화 하 는 동시에 우 리 는 자신의 소프트웨어 가 메모리 크기 에 대한 정 의 를 강제 할 수 있다.저 희 는 Dalvik 가 제공 하 는 dalvik.system.VMRuntime 류 를 사용 하여 최소 메모 리 를 설정 합 니 다. 
private final static int CWJ_HEAP_SIZE = 6* 1024* 1024 ; 
VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE); //최소 힙 메모 리 를 6MB 크기 로 설정 합 니 다.
물론 메모리 부족 에 대해 서 는 수 동 간섭 GC 를 통 해 처리 할 수 있다. 
3.기타 사용 방법
       1.서로 다른 크기 의 그림 은 같은 높이 의 미리 보기 그림(예 를 들 어 100 px)을 만들어 야 하고 그림 이 왜곡 되 지 않도록 해 야 한다.그러면 어떻게 해 야 합 니까?메모리 에 원본 그림 을 불 러 와 서 크기 조정 처 리 를 할 수 는 없 잖 아 요.모 바 일 개발 에서 메모리 가 상당히 소중 하고 100 K 그림 한 장 을 불 러 와 서 사용 하 는 메모리 가 100 K 밖 에 안 되 는 지 알 아야 해 요.
   연 구 를 통 해 Options 에 속성 inJustDecodeBounds 가 있 는 것 을 발 견 했 습 니 다.연 구 를 한 결과 무슨 뜻 인지 알 게 되 었 습 니 다.SDK 중의 E 문 은 이렇게 말 했 습 니 다.
      If set to true, the decoder will return null (no bitmap), but the out... fields will still be set, allowing the caller to query the bitmap without having to allocate the memory for its pixels.
이 값 이 true 로 설정 되면 실제 bitmap 에 메모리 공간 을 할당 하지 않 고 디 코딩 경계 정보,즉 그림 크기 정보 만 포함 되 어 있 으 면 해당 하 는 방법 이 나 옵 니 다.inJustDecodeBounds 를 true 로 설정 하여 outHeight(그림 원본 높이)와 outWidth(그림 의 원본 너비)를 얻 을 수 있 습 니 다.그리고 inSampleSize(크기 조정 값)를 계산 한 다음 그림 을 가 져 올 수 있 습 니 다.여기 서 주의해 야 할 것 은 inSampleSize 가 0 보다 작 을 수 있 으 므 로 판단 해 야 합 니 다.
       2.BitmapFactory 로 그림 을 디 코딩 할 때 오류 가 발생 할 수 있 습 니 다.이것 은 왕왕 그림 이 너무 커서 생 긴 것 이다.정상적으로 사용 하려 면 더 적은 메모리 공간 을 분배 하여 저장 해 야 한다.
BitmapFactory.Options.inSampleSize.적당 한 inSampleSize 를 설정 하면 BitmapFactory 가 이 오 류 를 없 애기 위해 더 적은 공간 을 분배 할 수 있 습 니 다.inSampleSize 의 구체 적 인 의 미 는 SDK 문 서 를 참고 하 십시오.예 를 들 면:
BitmapFactory.Options opts = new BitmapFactory.Options(); 
opts.inSampleSize = 4;
Bitmap bitmap = BitmapFactory.decodeFile(imageFile, opts); 

적절 한 inSampleSize 를 설정 하 는 것 이 이 문 제 를 해결 하 는 관건 중의 하나 이다.

좋은 웹페이지 즐겨찾기