android 异步回调加载网络图片

在做应用的时候很多时候都会去从网络加载图片,而且还要做各种各样的加载效果。比如,加载图片的时候在图片上显示loading的图片,图片加载完成时loading消失,加载失败又有相应的处理。如果处理不好就会很麻烦,下面总结了一个轻量级的从网络加载图片方法。

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

}

}



});


来自: http://www.2cto.com/kf/201110/107333.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值