Java中實現CallBack功能

轉自:http://blog.csdn.net/imzoer/article/details/9422013

在很多場景,作爲開發都會想到,在執行完畢一個任務的時候,能執行一個callback函數是多麼好的事情。

現在模擬一下這個情景:

定義三個類。分別是主函數類。callback函數的接口類。業務處理類。在業務處理類中,處理完業務之後,執行一個callback函數。

[java] view plaincopy
  1. package comz;  
  2.   
  3. public class Main {  
  4.     public static void main(String[] args) {  
  5.         new TestCallBack().compute(1000new ComputeCallBack() {  
  6.   
  7.             @Override  
  8.             public void onComputeEnd() {  
  9.                 System.out.println("end back!!!");  
  10.   
  11.             }  
  12.         });  
  13.     }  
  14. }  

這是主函數類。new了一個業務處理類來處理邏輯,並在處理完畢之後,執行callback函數。

[java] view plaincopy
  1. package comz;  
  2.   
  3. public class TestCallBack {  
  4.   
  5.     public void compute(int n, ComputeCallBack callback) {  
  6.         for (int i = 0; i < n; i++) {  
  7.             System.out.println(i);  
  8.         }  
  9.         callback.onComputeEnd();  
  10.     }  
  11. }  

這是業務處理類。僅僅輸出一些數字,然後執行回調函數。

[java] view plaincopy
  1. package comz;  
  2.   
  3. public interface ComputeCallBack {  
  4.     public void onComputeEnd();  
  5. }  

這是回調函數的接口。

--------------------------------------

運行上面的代碼,就會在輸出結束的時候調用在Main裏面的callback函數,輸出System.out.println("end back!!!");

--------------------------------------

這裏的原理是:

在主類中,新建業務類的時候,傳遞進去的第二個參數是一個實現了回調接口的匿名類對象。

在業務類中,我們調用了這個對象的onComputeEnd方法。在執行onComputeEnd的時候,jvm會找到這個對象的函數實現並調用。於是就輸出了end back!!!

---------------------------------------

寫這篇文章的靈感來自於這裏

這篇文章介紹了安卓下,下載圖片並緩存。文章中亮點不僅僅是回調函數的使用,而且還使用了SoftReference來做內存緩存。

下面的代碼,用SoftReference寫入內存緩存:

[java] view plaincopy
  1. /** 
  2.      * 從網絡端下載圖片 
  3.      *  
  4.      * @param url 
  5.      *            網絡圖片的URL地址 
  6.      * @param cache2Memory 
  7.      *            是否緩存(緩存在內存中) 
  8.      * @return bitmap 圖片bitmap結構 
  9.      *  
  10.      */  
  11.     public Bitmap getBitmapFromUrl(String url, boolean cache2Memory) {  
  12.         Bitmap bitmap = null;  
  13.         try {  
  14.             URL u = new URL(url);  
  15.             HttpURLConnection conn = (HttpURLConnection) u.openConnection();  
  16.             InputStream is = conn.getInputStream();  
  17.             bitmap = BitmapFactory.decodeStream(is);  
  18.   
  19.             if (cache2Memory) {  
  20.                 // 1.緩存bitmap至內存軟引用中  
  21.                 imageCache.put(url, new SoftReference<Bitmap>(bitmap));  
  22.                 if (cache2FileFlag) {  
  23.                     // 2.緩存bitmap至/data/data/packageName/cache/文件夾中  
  24.                     String fileName = getMD5Str(url);  
  25.                     String filePath = this.cachedDir + "/" + fileName;  
  26.                     FileOutputStream fos = new FileOutputStream(filePath);  
  27.                     bitmap.compress(Bitmap.CompressFormat.PNG, 100, fos);  
  28.                 }  
  29.             }  
  30.   
  31.             is.close();  
  32.             conn.disconnect();  
  33.             return bitmap;  
  34.         } catch (IOException e) {  
  35.             e.printStackTrace();  
  36.             return null;  
  37.         }  
  38.     }  

下面是從內存緩存中讀取圖片並返回:;

[java] view plaincopy
  1. /** 
  2.      * 從內存緩存中獲取bitmap 
  3.      *  
  4.      * @param url 
  5.      * @return bitmap or null. 
  6.      */  
  7.     public Bitmap getBitmapFromMemory(String url) {  
  8.         Bitmap bitmap = null;  
  9.         if (imageCache.containsKey(url)) {  
  10.             synchronized (imageCache) {  
  11.                 SoftReference<Bitmap> bitmapRef = imageCache.get(url);  
  12.                 if (bitmapRef != null) {  
  13.                     bitmap = bitmapRef.get();  
  14.                     return bitmap;  
  15.                 }  
  16.             }  
  17.         }  
  18.         // 從外部緩存文件讀取  
  19.         if (cache2FileFlag) {  
  20.             bitmap = getBitmapFromFile(url);  
  21.             if (bitmap != null)  
  22.                 imageCache.put(url, new SoftReference<Bitmap>(bitmap));  
  23.         }  
  24.   
  25.         return bitmap;  
  26.     }  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章