Android FAQ 메모리 오버플로우(OOM)
원인
1. 메모리 유출로 인해 빈번한 메모리 유출로 인해 메모리 유출이 발생할 수 있다.2. 메모리를 많이 사용하는 대상은 메모리를 많이 사용하는 여러 개의 대상(예를 들어 Bitmap)을 저장한다.초대형 그림 불러오기;
2. 해결 방안
1. 메모리 유출로 인한 OOM은 안드로이드의 흔한 문제의 메모리 유출을 참고할 수 있다.
2. 초대형 이미지를 탑재하여 만든 OOM 솔루션:
1) 같은 비율의 축소 이미지는 setImageBitmap 또는 setImageResource 또는 BitmapFactory를 사용합니다.decodeResource가 큰 그림을 설정할 때 이 함수들은 decode를 완성한 후에 최종적으로 자바층의createBitmap을 통해 완성되며 더 많은 메모리를 소모해야 한다.
public static Bitmap scaleImage(Bitmap bitmap, int newWidth, int newHeight) {
if (bitmap == null) {
return null;
}
float scaleWidth = (float) newWidth / bitmap.getWidth();
float scaleHeight = (float) newHeight / bitmap.getHeight();
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
}
2) 그림에 대한 소프트 인용을 사용하여 리시클() 조작을 신속하게 진행한다. 비록 시스템은 비트맵이 분배한 메모리가 최종적으로 소각되는 것을 확인할 수 있지만 너무 많은 메모리를 차지하기 때문에 자바더미의 제한을 초과할 가능성이 높다.따라서 비트맵을 다 썼을 때는 적시에 recycle을 떨어뜨려야 한다.리시클은 비트맵을 즉시 방출할 것인지는 확실하지 않지만 가상 컴퓨터에 "이 그림은 방출할 수 있다"는 암시를 줄 것이다.
SoftReference bitmap;
bitmap = new SoftReference<>(pBitmap);
if(bitmap != null){
if(bitmap.get() != null && !bitmap.get().isRecycled()){
bitmap.get().recycle();
bitmap = null;
}
}
3) XML의 중복 로드를 방지합니다. 단일 페이지의 가로 세로 화면을 여러 번 전환하면 OOM이 발생할 수 있습니다.따라서 페이지 레이아웃에 비교적 큰 그림이 존재할 때 xml의 관련 설정을 제거하고 프로그램에 배경도를 설정해야 한다.
ImageView imageView= (ImageView) findViewById(R.id.image_test);
imageView.setBackground(getDrawable(R.mipmap.ic_launcher));
또는 xml 프로필을view로 불러와서 용기에 넣고this를 호출합니다.setContentView(View view)
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.