在做應用的時候很多時候都會去從網絡加載圖片,而且還要做各種各樣的加載效果。比如,加載圖片的時候在圖片上顯示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);
}
}
});
如有遺漏之處,歡迎批評!
摘自:jacp的專欄