android非同步回撥載入網路圖片
阿新 • • 發佈:2019-01-26
在做應用的時候很多時候都會去從網路載入圖片,而且還要做各種各樣的載入效果。比如,載入圖片的時候在圖片上顯示loading的圖片,圖片載入完成時loading消失,載入失敗又有相應的處理。如果處理不好就會很麻煩,下面總結了一個輕量級的從網路載入圖片方法。
package com.jacp.util; import java.io.File; import java.io.IOException; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Handler; import android.os.Message; public class Utils { /** * 載入圖片 * @param url 圖片的url * @param listener 回撥監聽器 */ public void loadImage(final String url, final OnLoadImageListener listener) { if (null == url || null == listener) { return; } final Handler handler = new Handler() { public void handleMessage(Message msg) { listener.onLoadImage((Bitmap) msg.obj, url); } }; // 之前根據url寫入本地快取的路徑 String path = ""; File file = new File(path); if (file.exists()) { Bitmap bm = BitmapFactory.decodeFile(path); sendMessage(handler, bm); return; } new Thread(new Runnable() { public void run() { try { // 網路載入圖片,還可以加入延遲(time out)條件 URL u = new URL(url); HttpURLConnection httpConnection = (HttpURLConnection) u.openConnection(); if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK) { Bitmap bm = BitmapFactory.decodeStream(httpConnection.getInputStream()); sendMessage(handler, bm); // 同時對圖片進行快取... return; } // 沒有請求到圖片 sendMessage(handler, null); } catch (MalformedURLException e) { sendMessage(handler, null); } catch (IOException e) { sendMessage(handler, null); } } }).start(); } /** * 向handler傳送處理的訊息 * @param handler * @param bm */ private void sendMessage(Handler handler, Bitmap bm) { Message msg = handler.obtainMessage(); msg.obj = bm; handler.sendMessage(msg); } /** * 載入圖片時的回撥 * */ public interface OnLoadImageListener { public void onLoadImage(Bitmap bm, String imageUrl); } }
此例中用到了Handler,從而不需要用到AsyncTask,AsyncTask感覺使用起來很麻煩,而且貌似還有延遲。這樣做的話可以直接在回撥裡面做設定圖片處理,而不必要擔心是不是UI執行緒。如下:
new Utils().loadImage("圖片連結", new OnLoadImageListener() { @Override public void onLoadImage(Bitmap bm, String imageUrl) { if (null == bm) { imageView.setImageResource(R.drawable.default_img); } else { imageView.setBitmapImage(bm); } } });
如有遺漏之處,歡迎批評!