Android 그림 의 3 급 캐 시 메커니즘 인 스 턴 스 분석
우리 가 그림 을 가 져 올 때 그림 의 캐 시 를 잘 조율 하지 않 으 면 대량의 데이터,유 료 데이터 응용 을 초래 하고 사용자 의 체험 이 좋 지 않 으 며 후기 발전 에 영향 을 줄 수 있다.이 를 위해 저 는 안 드 로 이 드 이미지 의 3 급 캐 시 체 제 를 공유 하여 네트워크 에서 그림 을 가 져 와 응용 을 최적화 시 키 고 구체 적 으로 3 단계 로 나 누 어 진행 합 니 다.
(1)캐 시 에서 그림 가 져 오기
(2)로 컬 캐 시 디 렉 터 리 에서 그림 을 가 져 오고 가 져 온 후 캐 시 에 넣 습 니 다.
(3)인터넷 에서 그림 을 다운로드 하고 다운로드 가 완료 되면 로 컬 에 저장 하고 캐 시 에 저장 합 니 다.
이 3 층 이미지 캐 시 를 잘 조율 하면 응용 성능 과 사용자 체험 을 크게 향상 시 킬 수 있다.
3 급 캐 시 를 빠르게 실현 하 는 도구 류 ImageCacheUtil 은 다음 과 같다.
1.네트워크 에서 그림 을 가 져 오 는 3 급 캐 시 도구 류 ImageCacheUtil
public class ImageCacheUtil {
private LruCache<String, Bitmap> lruCache;
private File cacheDir;
private ExecutorService newFixedThreadPool;
private Handler handler;
public static final int SUCCESS = 100;
public static final int FAIL = 101;
// ,
//1.
//2. , ,
//3. , ,
public ImageCacheUtil(Context context,Handler handler){
//
int maxsize = (int) (Runtime.getRuntime().maxMemory()/8);
//maxSize :
lruCache = new LruCache<String, Bitmap>(maxsize){
// , ,
@Override
protected int sizeOf(String key, Bitmap value) {
//
//getRowBytes :
//getHeight :
return value.getRowBytes()*value.getHeight();
}
};
//
cacheDir = context.getCacheDir();
//
//nThreads :
newFixedThreadPool = Executors.newFixedThreadPool(5);
this.handler = handler;
}
/**
*
* @param url
* @param positon
* @return
*/
public Bitmap getBitmap(String url,int position){
Bitmap bitmap = null;
//1. (LRUCache<k,v>) k:key , url ,v:value
bitmap = lruCache.get(url);// key
//lruCache.put(url, bitmap):
if (bitmap!=null) {
return bitmap;
}
//2. , ,
bitmap = getFromLocal(url);
if (bitmap!=null) {
return bitmap;
}
//3. , ,
getFromNet(url,position);
return null;
}
/**
* , ,
* @param url
* @param position
*/
private void getFromNet(String url, int position) {
newFixedThreadPool.execute(new RunnableTask(url,position));
}
class RunnableTask implements Runnable{
private String imageUrl;
private int position;
public RunnableTask(String url,int position){
this.imageUrl = url;
this.position = position;
}
@Override
public void run() {
Message message = Message.obtain();
//
try {
URL url = new URL(imageUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(3000);
conn.setConnectTimeout(5000);
conn.setRequestMethod("GET");
InputStream inputStream = conn.getInputStream();
Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
//
wirteToLocal(imageUrl, bitmap);
//
lruCache.put(imageUrl, bitmap);
// , handler
message.what = SUCCESS;
message.obj = bitmap;
message.arg1 = position;
handler.sendMessage(message);
return;
} catch (Exception e) {
e.printStackTrace();
}
message.what = FAIL;
handler.sendMessage(message);
}
}
/**
*
* @param url
*/
private Bitmap getFromLocal(String url) {
//
try {
String fileName = MD5Encoder.encode(url).substring(10);
File file = new File(cacheDir, fileName);
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
//
lruCache.put(url, bitmap);
return bitmap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
*
*/
public void wirteToLocal(String url,Bitmap bitmap){
//url , MD5 , 10
try {
String fileName = MD5Encoder.encode(url).substring(10);
File file = new File(cacheDir, fileName);
FileOutputStream out = new FileOutputStream(file);
//format : (android png , png )
//quality :
//stream :
bitmap.compress(CompressFormat.JPEG, 100, out);//
} catch (Exception e) {
e.printStackTrace();
}
}
}
MD5Encoder 클래스 는 다음 과 같 습 니 다.
public class MD5Encoder {
public static String encode(String string) throws Exception {
byte[] hash = MessageDigest.getInstance("MD5").digest(string.getBytes("UTF-8"));
StringBuilder hex = new StringBuilder(hash.length * 2);
for (byte b : hash) {
if ((b & 0xFF) < 0x10) {
hex.append("0");
}
hex.append(Integer.toHexString(b & 0xFF));
}
return hex.toString();
}
}
2.MainActivity 에서 imageCacheUtil 초기 화
ImageCacheUtil imageCacheUtil = new ImageCacheUtil(getApplicationContext, handler);
3.MainActivity 에서 handler 를 통 해 그림 보이 기그림 은 도구 류 를 통 해 다운로드 에 성공 한 후 로 컬 캐 시 와 시스템 캐 시 에 그림 을 저장 해 야 할 뿐만 아니 라 그림 도 표시 해 야 합 니 다.handler 를 통 해 처리 합 니 다.이 handler 는 ImageCacheUtil 도구 류 를 사용 하 는 설정 이 므 로 handler 를 전달 하여 해당 하 는 ImageCacheUtil 도구 류 를 사용 하 는 클래스 에 메 시 지 를 전달 하 는 데 편리 합 니 다.
private Handler handler = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case ImageCacheUtil.SUCCESS:
//
Bitmap bitmap = (Bitmap) msg.obj;
int position = msg.arg1;
ImageView image= (ImageView) view.findViewWithTag(position);//
if (image != null && bitmap != null) {
image.setImageBitmap(bitmap);
}
break;
case ImageCacheUtil.FAIL:
Toast.makeText(getApplicationContext, " ", 0).show();
break;
}
};
};
4.MainActivity 의 adapter getview 에서 호출
Bitmap bitmap = imageCacheUtil.getBitmap(list.get(position).listimage, position);
if (bitmap != null) {
viewHodler.image.setImageBitmap(bitmap);
}
읽 어 주 셔 서 감사합니다. 여러분 에 게 도움 이 되 기 를 바 랍 니 다.본 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.