(轉(zhuǎn))Java中實(shí)現(xiàn)CallBack功能

在很多場(chǎng)景,作為開發(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)接口的匿名類對(duì)象。

在業(yè)務(wù)類中,我們調(diào)用了這個(gè)對(duì)象的onComputeEnd方法。在執(zhí)行onComputeEnd的時(shí)候,jvm會(huì)找到這個(gè)對(duì)象的函數(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;  
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚_t_閱讀 31,740評(píng)論 18 399
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,837評(píng)論 18 139
  • //Clojure入門教程: Clojure – Functional Programming for the J...
    葡萄喃喃囈語(yǔ)閱讀 3,730評(píng)論 0 7
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,832評(píng)論 0 11
  • 鹿晗有女朋友了,微博癱瘓了,粉絲要瘋了,在十一假期的最后一天網(wǎng)絡(luò)爆了,鹿晗體都遍布朋友圈了。 做為當(dāng)下...
    為誰(shuí)執(zhí)筆天下閱讀 310評(píng)論 0 1