在很多場景,作為開發(fā)都會(huì)想到涂身,在執(zhí)行完畢一個(gè)任務(wù)的時(shí)候,能執(zhí)行一個(gè)callback函數(shù)是多么好的事情搓蚪。
現(xiàn)在模擬一下這個(gè)情景:
定義三個(gè)類蛤售。分別是主函數(shù)類。callback函數(shù)的接口類妒潭。業(yè)務(wù)處理類悴能。在業(yè)務(wù)處理類中,處理完業(yè)務(wù)之后雳灾,執(zhí)行一個(gè)callback函數(shù)漠酿。
public class Main { public static void main(String[] args) { new TestCallBack().compute(1000, new ComputeCallBack() { @Override public void onComputeEnd() { System.out.println("end back!!!"); } }); } }
這是主函數(shù)類。new了一個(gè)業(yè)務(wù)處理類來處理邏輯谎亩,并在處理完畢之后炒嘲,執(zhí)行callback函數(shù)宇姚。
public class TestCallBack { public void compute(int n, ComputeCallBack callback) { for (int i = 0; i < n; i++) { System.out.println(i); } callback.onComputeEnd(); } }
這是業(yè)務(wù)處理類。僅僅輸出一些數(shù)字夫凸,然后執(zhí)行回調(diào)函數(shù)浑劳。
public interface ComputeCallBack { public void onComputeEnd(); }
這是回調(diào)函數(shù)的接口。
運(yùn)行上面的代碼寸痢,就會(huì)在輸出結(jié)束的時(shí)候調(diào)用在Main里面的callback函數(shù)呀洲,輸出System.out.println("end back!!!");
這里的原理是:
在主類中紊选,新建業(yè)務(wù)類的時(shí)候啼止,傳遞進(jìn)去的第二個(gè)參數(shù)是一個(gè)實(shí)現(xiàn)了回調(diào)接口的匿名類對象。
在業(yè)務(wù)類中兵罢,我們調(diào)用了這個(gè)對象的onComputeEnd方法献烦。在執(zhí)行onComputeEnd的時(shí)候,jvm會(huì)找到這個(gè)對象的函數(shù)實(shí)現(xiàn)并調(diào)用卖词。于是就輸出了end back!!!
寫這篇文章的靈感來自于這里
這篇文章介紹了安卓下巩那,下載圖片并緩存。文章中亮點(diǎn)不僅僅是回調(diào)函數(shù)的使用此蜈,而且還使用了SoftReference來做內(nèi)存緩存即横。
下面的代碼,用SoftReference寫入內(nèi)存緩存:
/**
* 從網(wǎng)絡(luò)端下載圖片
*
* @param url
* 網(wǎng)絡(luò)圖片的URL地址
* @param cache2Memory
* 是否緩存(緩存在內(nèi)存中)
* @return bitmap 圖片bitmap結(jié)構(gòu)
*
*/
public Bitmap getBitmapFromUrl(String url, boolean cache2Memory) {
Bitmap bitmap = null;
try {
URL u = new URL(url);
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
InputStream is = conn.getInputStream();
bitmap = BitmapFactory.decodeStream(is);
if (cache2Memory) {
// 1.緩存bitmap至內(nèi)存軟引用中
imageCache.put(url, new SoftReference<Bitmap>(bitmap));
if (cache2FileFlag) {
// 2.緩存bitmap至/data/data/packageName/cache/文件夾中
String fileName = getMD5Str(url);
String filePath = this.cachedDir + "/" + fileName;
FileOutputStream fos = new FileOutputStream(filePath);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);
}
}
is.close();
conn.disconnect();
return bitmap;
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
下面是從內(nèi)存緩存中讀取圖片并返回:裆赵;
/**
* 從內(nèi)存緩存中獲取bitmap
*
* @param url
* @return bitmap or null.
*/
public Bitmap getBitmapFromMemory(String url) {
Bitmap bitmap = null;
if (imageCache.containsKey(url)) {
synchronized (imageCache) {
SoftReference<Bitmap> bitmapRef = imageCache.get(url);
if (bitmapRef != null) {
bitmap = bitmapRef.get();
return bitmap;
}
}
}
// 從外部緩存文件讀取
if (cache2FileFlag) {
bitmap = getBitmapFromFile(url);
if (bitmap != null)
imageCache.put(url, new SoftReference<Bitmap>(bitmap));
}
return bitmap;
}