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);
				}
			}
        	
        });

如有遗漏之处,欢迎批评!




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