Bitmap 로드 및 Cache

4070 단어
안드로이드 개발 아트 탐색 노트
1: Bitmap의 대학교 로드
Bitmap은 Android에서 얼마나 다양한 포맷의 이미지를 나타냅니다.
1. Bitmap 로드 방법:
BitmapFactory는 네 가지 방법을 제공했다. decodeFile, decodeResourse, decodeStream, decodeByteArray는 각각 파일 시스템, 자원, 입력 흐름, 바이트 그룹에서 Bitmap을 불러오는 데 대응한다.
Bitmap의 크기가 ImageView의 크기에 비해 유익하기 때문에 자원 낭비와 메모리 부족을 초래할 수 있다. 네 가지 로드 경로가 모두 BitmapFactory를 제공한다.Options는 축소된 이미지를 일정한 샘플링 비율로 로드하여 OOM을 어느 정도 피합니다.
BitmapFactory를 통해그림을 불러옵니다. 주로 inSampleSize 매개 변수 (즉 샘플링 확률) 인 inSampleSize가 1일 때 원도에 불러옵니다. 1시간 이상과 너비가 원래의 1/inSampleSize로 축소됩니다.inSampleSize<1의 경우 축척 효과가 없는 1과 같습니다.
공식 문서에 따르면 inSampleSIze의 값은 총 2의 지수이며 외부에서 전달된 파라미터가 2의 지수가 아니라면 자동으로 아래로 이동하여 가장 가까운 2의 지수를 선택하여 대체할 것이다.
1) 그렇다면 이 샘플링 확률을 어떻게 얻을 것인가
다음 절차를 따르십시오.
1: BitmapFactory.Options의 inJust Decode Bounds 매개 변수를true로 설정하고 그림을 불러옵니다 2:Bitmap Factory에서.Options에서 원시 너비 정보 추출 3: 목표 View의 크기와 결합하여 샘플링 확률 계산 4: 샘플링 확률에 따라 그림 불러오기
코드는 다음과 같습니다.
/**
 * Created by coderlt on 2017/8/12.
 */

public class BitmapUntity {
    public static final String TAG="BitmapUntity";

    public static Bitmap decodeSampledBitmapFromResource(Resources res,int resId,int targetWidth,int targetHeight){
        final BitmapFactory.Options options=new BitmapFactory.Options(); //Options   static class
        options.inJustDecodeBounds=true;
        BitmapFactory.decodeResource(res,resId,options);

        options.inSampleSize=caculateInSampleSize(options,targetWidth,targetHeight);

        options.inJustDecodeBounds=false;
        return BitmapFactory.decodeResource(res,resId,options);
    }

    public static int caculateInSampleSize(BitmapFactory.Options options,int targetWidth,int targetHeight){
        int outWidth =options.outWidth;
        int outHeight=options.outHeight;
        int inSampleSize=1;

        if(outWidth>targetWidth || outHeight>targetHeight){
            final int halfHeight = outHeight/2;
            final int halfWidth = outWidth/2;

            while( (halfWidth/inSampleSize)>=targetHeight && (halfHeight/inSampleSize)>=targetHeight){
                inSampleSize *=2;
                Log.d(TAG,"inSampleSize is :"+inSampleSize);
            }
        }

        return inSampleSize;
    }

}

2: Android의 캐시 정책
배경: 이동 장치의 데이터 요금 계산, 자원의 적재 속도, 캐시가 생겨납니다.캐시 정책은 주로 캐시의 추가, 취득, 삭제 세 가지 측면과 관련된다.캐시를 할 때 캐시 영역의 최대 용량을 지정해야 하는데 현재 자주 사용하는 캐시 알고리즘은 LRU(Least Recently Used)이다. LRU 알고리즘을 사용하는 캐시는 두 가지가 있는데 LruCache와 DiskLruCache이다.양자는 각각 메모리 캐시와 저장 장치 캐시를 실현한다.
1.LruCache
LruCache는 안드로이드 3.1 캐시 클래스 제공
public void LruCacheTest(){
        int maxMemory=(int)(Runtime.getRuntime().maxMemory()/1024);
        int cacheSize=maxMemory/8;
        //    
        LruCache  mMemoryCache=new LruCache(cacheSize){
            @Override
            protected int sizeOf(String key,Bitmap bitmap){
                return bitmap.getRowBytes()*bitmap.getHeight()/1024;
            }
        };
}

2. DiskLruCache 디스크 캐시
DiskLruCache는 안드로이드 공식 문서의 추천을 받았지만 안드로이드 SDK의 일부분에 속하지 않습니다.
public static DiskLruCache open(File directory,int appVersion,int valueCount,long maxSize)
public void DiskLruCacheTest(){
        File diskCacheDir=getDiskCacheDir("bitmap");
        if(!diskCacheDir.exists()){
            diskCacheDir.mkdirs();
        }
        try{
            DiskLruCache mDiskLruCache=DiskLruCache.open(diskCacheDir,1,1,DISK_CACHE_SIZE);
        }catch(IOException ex){
            System.err.println(ex);
        }
    }

//    bitmap     
public File getDiskCacheDir(String fileName){
        final String cachePath;
        if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
            cachePath=getExternalCacheDir().getPath();
        }
        else
            cachePath=getCacheDir().getPath();
        return new File(cachePath+File.separator+fileName);
    }

DIskLruCache 캐시 추가(키워드 Editor)
Editor는 캐시된 객체의 편집 객체를 나타냅니다.

좋은 웹페이지 즐겨찾기