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

在很多場景,作為開發(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;  
}  
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末东囚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子战授,更是在濱河造成了極大的恐慌页藻,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件植兰,死亡現(xiàn)場離奇詭異份帐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)楣导,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門废境,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人筒繁,你說我怎么就攤上這事噩凹。” “怎么了膝晾?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵栓始,是天一觀的道長。 經(jīng)常有香客問我血当,道長幻赚,這世上最難降的妖魔是什么禀忆? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮落恼,結(jié)果婚禮上箩退,老公的妹妹穿的比我還像新娘。我一直安慰自己佳谦,他們只是感情好戴涝,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钻蔑,像睡著了一般啥刻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咪笑,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天可帽,我揣著相機(jī)與錄音,去河邊找鬼窗怒。 笑死映跟,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扬虚。 我是一名探鬼主播努隙,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼辜昵!你這毒婦竟也來了荸镊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤路鹰,失蹤者是張志新(化名)和其女友劉穎贷洲,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晋柱,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡优构,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了雁竞。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钦椭。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖碑诉,靈堂內(nèi)的尸體忽然破棺而出彪腔,到底是詐尸還是另有隱情,我是刑警寧澤进栽,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布德挣,位于F島的核電站,受9級特大地震影響快毛,放射性物質(zhì)發(fā)生泄漏格嗅。R本人自食惡果不足惜番挺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屯掖。 院中可真熱鬧玄柏,春花似錦、人聲如沸贴铜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽绍坝。三九已至徘意,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間陷嘴,已是汗流浹背映砖。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工间坐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留灾挨,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓竹宋,卻偏偏與公主長得像劳澄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子蜈七,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

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

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