Bitmap 로드 및 Cache
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는 캐시된 객체의 편집 객체를 나타냅니다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.