AN Gridview 그림 미리 보기 그림을 로드하여 OOM 문제 해결

1751 단어
이 OOM이 나타나는 것은 상식이 부족하기 때문에 여기서 보완한다
OOM이 생기는 이유: 그림을 모두 메모리에 불러와서 축소하기
OOM의 키 코드가 나타납니다. BitmapFactory.decodeFile(file.getAbsolutePath());
해결의 관건은 그림의 넓고 높은 관건적인 속성을 가져와 원시 그림이 아닌 메모리에 불러온 다음에 축소하는 것이다
OOM 해결을 위한 주요 코드: BitmapFactory.decodeFile(filePath, options) ;
먼저 예를 보겠습니다.
    public static int calculateRatioSize(BitmapFactory.Options options,
            int reqWidth, int reqHeight) {
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;
        if (height > reqHeight || width > reqWidth) {
            final int heightRatio = Math.round((float) height / (float) reqHeight);
            final int widthRatio = Math.round((float) width / (float) reqWidth);
            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
        }
        return inSampleSize;
    }

    public static Bitmap decodeSampledBitmapFromFilePath(String filePath,
            int reqWidth, int reqHeight) {
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;// A
        BitmapFactory.decodeFile(filePath, options) ;
        options.inSampleSize = calculateRatioSize(options, reqWidth, reqHeight);
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(filePath, options) ;// B
    }

BitmapFactory.Options options의 inJustDecodeBounds를 true로 설정
원본 그림을 불러오지 않고 메모리에 들어갈 수 있습니다. 설정한 후에 A가 되돌아오는 Bitmap은 null입니다.
그리고 주어진 크기의 넓이에 따라 크기 조정 비율 inSampleSize를 계산합니다.
마지막으로 options.inJustDecodeBounds=false를 끄고bitmap 대상을 다시 읽습니다. 이것은 B가 원하는 그림의 미리 보기 그림입니다.
마지막으로 참조된 두 블로그:
클릭하여 링크 열기 1
클릭하여 링크 열기 2

좋은 웹페이지 즐겨찾기