Android 가 그림 을 처리 할 때 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 를 설정 하 는 것 이 이 문 제 를 해결 하 는 관건 중의 하나 이다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.