android異步回調加載網絡圖片

在做應用的時候很多時候都會去從網絡加載圖片,而且還要做各種各樣的加載效果。比如,加載圖片的時候在圖片上顯示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);
				}
			}
        	
        });

如有遺漏之處,歡迎批評!




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