,首先定義個工具類:
/* * 非同步任務 ,接受的參數是 要下載圖片的url * 傳回值 是這個圖片 的bitMap */public class LoadImageAsyncTask extendsAsyncTask<String, Void, Bitmap> { // 定義一個介面 ,介面裡麵包含了幾個需要實現的方法 // 誰調用 LoadImageAsyncTask 就必須實現這個介面裡面定義的方法 privateLoadImageCallback loadImageCallback; //因為LoadImageAsyncTask 沒有預設的空參數的構造方法 publicLoadImageAsyncTask(LoadImageCallback loadImageCallback) { this.loadImageCallback = loadImageCallback; } publicinterface LoadImageCallback{ //當圖片被載入上來需要執行的方法 voidonImageLoaded(Bitmap bitmap); // 在圖片下載之前需要執行的方法 voidbeforeImageLoaded(); } <span data-mce-="">// 在後台運行 非ui線程 </span> // 可變長度的參數 其實就是 parms的數組 @Override protectedBitmap doInBackground(String... params) { try{ //擷取可變長度參數的第一個參數的string 代表的是 圖片的地址 String iconpath = params[0]; URL url =new URL(iconpath); URLConnection conn = url.openConnection(); Bitmap bitmap = BitmapFactory.decodeStream(conn.getInputStream()); returnbitmap; }catch (Exception e) { e.printStackTrace(); returnnull; } } // 背景工作執行前的操作 <span data-mce-="">//運行在ui線程中的</span> @Override protectedvoid onPreExecute() { loadImageCallback.beforeImageLoaded(); super.onPreExecute(); } // 背景工作執行完畢後的操作 <span data-mce-="">// 運行在ui線程中</span> @Override protectedvoid onPostExecute(Bitmap result) { super.onPostExecute(result); // 需要把bitmap 設定到某個控制項上 loadImageCallback.onImageLoaded(result); }}?AsyncTask<Params, Progress, Result>泛型裡面的參數是可以改變的,如這個工具類第一個參數就是圖片的路徑,第二個參數就是執行的進度,第三個參數是返回是BitMap?if (map.containsKey(iconname)) { // 如果map集合中存在軟引用的對象 SoftReference<Bitmap> obj = map.get(iconname); Bitmap bitmap = obj.get(); iv_book.setImageBitmap(bitmap); Log.i("MyReadActivity","使用記憶體緩衝"); }else { LoadImageAsyncTask task =new LoadImageAsyncTask( newLoadImageCallback() { publicvoid onImageLoaded(Bitmap bitmap) { iv_book.setImageBitmap(bitmap); // <span data-mce-="">儲存到sd卡上</span> 緩衝方式1 /* * try { File file = new File(Environment * .getExternalStorageDirectory(), "/image" + * iconname); FileOutputStream fos = new * FileOutputStream( file); // 把記憶體中的圖片儲存到了sd卡中 * bitmap.compress(CompressFormat.JPEG, 100, * fos); } catch (Exception e) { * e.printStackTrace(); } */ // <span data-mce-="">把圖片儲存到記憶體中</span> 緩衝方式2 map.put(iconname,new <span data-mce-="">SoftReference</span><Bitmap>( bitmap)); Log.i("MyReadActivity","把圖片存放到記憶體緩衝中 "); } publicvoid beforeImageLoaded() { iv_book.setImageResource(R.drawable.book); Log.i("MyReadActivity","下載伺服器圖片 "); } }); // 非同步從伺服器上下載圖片 task.execute(path); }