android异步加载图片

 

package cn.com.mzba.service;

import java.io.InputStream;
import java.lang.ref.SoftReference;
import java.net.URL;
import java.util.HashMap;

import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.os.Message;
import android.widget.ImageView;
/**
 * 实现图片的异步载入显示
 * @author kandanle
 *
 */
public class AsyncImageLoader {

	/**
	 * 软引用对象,在响应内存需要时,由垃圾回收器决定是否清除此对象。软引用对象最常用于实现内存敏感的缓存。
	 */
	private HashMap<String, SoftReference<Drawable>> imageCache;
	
	public AsyncImageLoader(){
		imageCache = new HashMap<String, SoftReference<Drawable>>();
	}
	
	public Drawable loadDrawable(final String imageUrl,final ImageView imageView,final ImageCallback imagecallback){
		if(imageCache.containsKey(imageUrl)){
			//从缓存中读取
			SoftReference<Drawable> softReference = imageCache.get(imageUrl);
			Drawable drawable = softReference.get();
			if(drawable != null){
				return drawable;
			}
		}
		final Handler handler = new Handler(){
			@Override
			public void handleMessage(Message msg) {
				super.handleMessage(msg);
				imagecallback.imageLoaded((Drawable)msg.obj, imageView, imageUrl);
			}
		};
		new Thread(){
			public void run() {
				Drawable drawable = loadImageFromUrl(imageUrl);
				imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
				Message message = handler.obtainMessage(0, drawable);
				handler.sendMessage(message);
			}
		}.start();
		
		return null;
	}
	
	public static Drawable loadImageFromUrl(String urlPath){
		URL url;
		InputStream is = null;
		try{
			url = new URL(urlPath);
			is = (InputStream)url.getContent();
		}catch(Exception e){
			e.printStackTrace();
		}
		Drawable drawable = Drawable.createFromStream(is, "src");
		return drawable;
	}
	
}

 

 

 

package cn.com.mzba.service;

import android.graphics.drawable.Drawable;
import android.widget.ImageView;

public interface ImageCallback {
    public void imageLoaded(Drawable imageDrawable,ImageView imageView, String imageUrl);
}

 

 

使用例子:

 

Drawable drawable = asyncImageLoader.loadDrawable(weiboInfo.getUserIcon(), viewUserIcon, new ImageCallback() {
	@Override
	public void imageLoaded(Drawable imageDrawable, ImageView imageView,String imageUrl) {
	imageView.setImageDrawable(imageDrawable);
        }
});
if(drawable == null){
	viewUserIcon.setImageResource(R.drawable.portrait);
}else{
	viewUserIcon.setImageDrawable(drawable);
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个可以实现ImageView异步图片,内存缓存,文件缓存,imageview显示图片时增淡入淡出动画。解决了:1. listviewoom问题 2. listview时卡顿的现象 3. listview时item中图片重复错位等情况 可以配置: 1. 设置图片的最大尺寸 2. 设置默认图片的显示 3. 设置图片位图模式 4. 设置内存缓存的最大值。 5. 文件缓存保存的目录   这个框架基本的代码是很久以前不知道哪里弄的,零零碎碎的,现在已经优化了很多,所以现在上传到github上共享。   讲讲使用方式吧:   首先使用前下源码或者jar包(见github:https://github.com/wangjiegulu/ImageLoaderSample) 然后进行图片器(ImageLoader)的配置和初始化,推荐的方法如下: 新建MyApplication类,继承Application,在onCreate中增如下代码:/**  * Created with IntelliJ IDEA.  * Author: wangjie  email:tiantian.china.2@gmail.com  * Date: 14-2-27  * Time: 上午11:25  */ public class MyApplication extends Application{     @Override     public void onCreate() {         super.onCreate();         ImageLoader.init(getApplicationContext(),                 new CacheConfig()                     .setDefRequiredSize(600) // 设置默认的图片尺寸(表示宽高任一不超过该值,默认是70px)                     .setDefaultResId(R.drawable.ic_launcher) // 设置显示的默认图片(默认是0,即空白图片)                     .setBitmapConfig(Bitmap.Config.ARGB_8888) // 设置图片位图模式(默认是Bitmap.CacheConfig.ARGB_8888)                     .setMemoryCachelimit(Runtime.getRuntime().maxMemory() / 3) // 设置图片内存缓存大小(默认是Runtime.getRuntime().maxMemory() / 4) //                  .setFileCachePath(Environment.getExternalStorageDirectory().toString()   "/mycache") // 设置文件缓存保存目录         );     }     …… }然后再AndroidManifest.xml中添:......到此,配置已经全部完成:接下来,使用ImageLoader来图片:holder.progress.setText("0%");     holder.progress.setVisibility(View.VISIBLE);     final ViewHolder vhr = holder;     ImageLoader.getInstances().displayImage(list.get(position), holder.image, new ImageLoader.OnImageLoaderListener() {         @Override         public void onProgressImageLoader(ImageView imageView, int currentSize, int totalSize) {             vhr.progress.setText(currentSize * 100 / totalSize   "%");         }         @Override         public void onFinishedImageLoader(ImageView imageView, Bitmap bitmap) {             vhr.progress.setVisibility(View.GONE);         }     });     或者:     ImageLoader.getInstances().displayImage(url, imageIv);     或者     ImageLoader.getInstances().displayImage(url, imageIv, 100);备注:例子中,用到了一部分注解(与ImageLoader功能无关,但是可以简化代码的编写) 可以点下面连接进入:github:https://github.com/wangjiegulu/androidInject博客:http://www.cnblogs.com/tiantianbyconan/p/3459139.htmlhttp://www.cnblogs.com/tiantianbyconan/p/3540427.html

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值