안드로이드의 그림 레벨 3 캐시
17453 단어 안드로이드 매일 필수
1. 사용자 정의 이미지 캐시 도구 클래스(MyBitmapUtils)
new MyBitmapUtils().display(ImageView ivPic, String url)
를 통해 외부 방법으로 이미지 캐시를 제공하는 인터페이스 /**
* BitmapUtils,
*/
public class MyBitmapUtils {
private NetCacheUtils mNetCacheUtils;
private LocalCacheUtils mLocalCacheUtils;
private MemoryCacheUtils mMemoryCacheUtils;
public MyBitmapUtils(){
mMemoryCacheUtils=new MemoryCacheUtils();
mLocalCacheUtils=new LocalCacheUtils();
mNetCacheUtils=new NetCacheUtils(mLocalCacheUtils,mMemoryCacheUtils);
}
public void disPlay(ImageView ivPic, String url) {
ivPic.setImageResource(R.mipmap.pic_item_list_default);
Bitmap bitmap;
//
bitmap=mMemoryCacheUtils.getBitmapFromMemory(url);
if (bitmap!=null){
ivPic.setImageBitmap(bitmap);
System.out.println(" .....");
return;
}
//
bitmap = mLocalCacheUtils.getBitmapFromLocal(url);
if(bitmap !=null){
ivPic.setImageBitmap(bitmap);
System.out.println(" .....");
// ,
mMemoryCacheUtils.setBitmapToMemory(url,bitmap);
return;
}
//
mNetCacheUtils.getBitmapFromNet(ivPic,url);
}
}
2. 네트워크 캐시(NetCacheUtils)
/**
*
*/
public class NetCacheUtils {
private LocalCacheUtils mLocalCacheUtils;
private MemoryCacheUtils mMemoryCacheUtils;
public NetCacheUtils(LocalCacheUtils localCacheUtils, MemoryCacheUtils memoryCacheUtils) {
mLocalCacheUtils = localCacheUtils;
mMemoryCacheUtils = memoryCacheUtils;
}
/**
*
* @param ivPic imageview
* @param url
*/
public void getBitmapFromNet(ImageView ivPic, String url) {
new BitmapTask().execute(ivPic, url);// AsyncTask
}
/**
* AsyncTask handler
* :
* :
* :onPostExecute
*/
class BitmapTask extends AsyncTask<Object, Void, Bitmap> {
private ImageView ivPic;
private String url;
/**
* ,
* @param params
* @return
*/
@Override
protected Bitmap doInBackground(Object[] params) {
ivPic = (ImageView) params[0];
url = (String) params[1];
return downLoadBitmap(url);
}
/**
* ,
* @param values
*/
@Override
protected void onProgressUpdate(Void[] values) {
super.onProgressUpdate(values);
}
/**
* ,
* @param result
*/
@Override
protected void onPostExecute(Bitmap result) {
if (result != null) {
ivPic.setImageBitmap(result);
System.out.println(" .....");
// ,
mLocalCacheUtils.setBitmapToLocal(url, result);
//
mMemoryCacheUtils.setBitmapToMemory(url, result);
}
}
}
/**
*
* @param url
* @return
*/
private Bitmap downLoadBitmap(String url) {
HttpURLConnection conn = null;
try {
conn = (HttpURLConnection) new URL(url).openConnection();
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
conn.setRequestMethod("GET");
int responseCode = conn.getResponseCode();
if (responseCode == 200) {
//
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize=2;// 1/2
options.inPreferredConfig=Bitmap.Config.ARGB_4444;
Bitmap bitmap = BitmapFactory.decodeStream(conn.getInputStream(),null,options);
return bitmap;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
conn.disconnect();
}
return null;
}
}
3. 로컬 캐시(LocalCacheUtils)
/**
*
*/
public class LocalCacheUtils {
private static final String CACHE_PATH= Environment.getExternalStorageDirectory().getAbsolutePath()+"/WerbNews";
/**
*
* @param url
*/
public Bitmap getBitmapFromLocal(String url){
String fileName = null;// url , MD5
try {
fileName = MD5Encoder.encode(url);
File file=new File(CACHE_PATH,fileName);
Bitmap bitmap = BitmapFactory.decodeStream(new FileInputStream(file));
return bitmap;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* ,
* @param url
* @param bitmap
*/
public void setBitmapToLocal(String url,Bitmap bitmap){
try {
String fileName = MD5Encoder.encode(url);// url , MD5
File file=new File(CACHE_PATH,fileName);
// ,
File parentFile = file.getParentFile();
if (!parentFile.exists()){
parentFile.mkdirs();
}
//
bitmap.compress(Bitmap.CompressFormat.JPEG,100,new FileOutputStream(file));
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. 메모리 캐시(Memory CacheUtils)
단색도: 픽셀당 1/8바이트, 16색도: 픽셀당 1/2바이트, 256색도: 픽셀당 1바이트, 24비트맵: 픽셀당 3바이트(흔한 rgb로 구성된 그림)
HashMap
SoftReference를 통해 소프트 인용 대상(GC 쓰레기 회수는 자동으로 소프트 인용 대상)을 회수하지만 안드로이드2.3+ 이후 시스템은 약한 인용 대상을 회수하는 것을 우선적으로 고려하고 공식적으로 LruCacheHashMap>
least recentlly use 최소 최근 사용 알고리즘은 메모리를 일정한 크기로 제어하고 최대치를 초과할 때 자동으로 회수한다. 이 최대치는 개발자가 스스로 정한다 /**
*
*/
public class MemoryCacheUtils {
// private HashMap mMemoryCache=new HashMap<>();//1. , ,
// private HashMap> mMemoryCache = new HashMap<>();//2. Android2.3+ , , LruCache
private LruCache mMemoryCache;
public MemoryCacheUtils(){
long maxMemory = Runtime.getRuntime().maxMemory()/8;// 1/8, ,
// , 16M,
mMemoryCache=new LruCache((int) maxMemory){
//
@Override
protected int sizeOf(String key, Bitmap value) {
int byteCount = value.getByteCount();
return byteCount;
}
};
}
/**
*
* @param url
*/
public Bitmap getBitmapFromMemory(String url) {
//Bitmap bitmap = mMemoryCache.get(url);//1.
/*2.
SoftReference bitmapSoftReference = mMemoryCache.get(url);
if (bitmapSoftReference != null) {
Bitmap bitmap = bitmapSoftReference.get();
return bitmap;
}
*/
Bitmap bitmap = mMemoryCache.get(url);
return bitmap;
}
/**
*
* @param url
* @param bitmap
*/
public void setBitmapToMemory(String url, Bitmap bitmap) {
//mMemoryCache.put(url, bitmap);//1.
/*2.
mMemoryCache.put(url, new SoftReference<>(bitmap));
*/
mMemoryCache.put(url,bitmap);
}
}