Android学习——图片异步加载工具类 用到了SoftReference

来源与网络,具体地址忘记了,写篇博客记录下 ,方便自己以后使用 。 谢谢原作者 。

public class AsyncImageLoader {

	public Map<String, SoftReference<Drawable>> imageCache = new HashMap<String, SoftReference<Drawable>>();  
	// 固定五个线程来执行任务
    private ExecutorService executorService = Executors.newFixedThreadPool(5);   
    private final Handler handler = new Handler();  
    
    /** 
     *  
     * @param imageUrl  图像url地址 
     * @param callback  回调接口 
     * @return 返回内存中缓存的图像,第一次加载返回null 
     */  
    public Drawable loadDrawable(final String imageUrl,  
            final ImageCallback callback) {  
        // 如果缓存过就从缓存中取出数据  
        if (imageCache.containsKey(imageUrl)) {  
            SoftReference<Drawable> softReference = imageCache.get(imageUrl);  
            if (softReference.get() != null) {  
                return softReference.get();  
            }  
        }  
       
        // 缓存中没有图像,则从网络上取出数据,并将取出的数据缓存到内存中  
        executorService.submit(new Runnable() {  
        	 
            public void run() {  
                try {  
                    final Drawable drawable = loadImageFromUrl(imageUrl);   
                          
                    imageCache.put(imageUrl, new SoftReference<Drawable>(  
                            drawable));  
                    System.out.println(Thread.currentThread().getId());
                    handler.post(new Runnable() {  
                        public void run() {  
                            callback.imageLoaded(drawable);  
                            callback.returnImageLoaded(drawable);  
                        }  
                        
                    });  
                } catch (Exception e) {  
                    throw new RuntimeException(e);  
                }  
            }  
        });  
        return null;  
    }  
  
    // 从网络上取数据方法  
    protected Drawable loadImageFromUrl(String imageUrl) {  
        try {  
            // 测试时,模拟网络延时,实际时这行代码不能有  
            //SystemClock.sleep(2000);  
            return Drawable.createFromStream(new URL(imageUrl).openStream(),  
                    "image.png");  
        } catch (Exception e) {  
            throw new RuntimeException(e);  
        }  
    }  
  
    // 对外界开放的回调接口  
    public interface ImageCallback {  
        // 注意 此方法是用来设置目标对象的图像资源  
        public void imageLoaded(Drawable imageDrawable);
        public Drawable returnImageLoaded(Drawable imageDrawable);
        
    }  
}

调用的地方可以这么写

private AsyncImageLoader asyncImageLoader3 = new AsyncImageLoader();  
	  
    // 引入线程池,并引入内存缓存功能,并对外部调用封装了接口,简化调用过程  
    private Drawable loadImage4(final String url, final ImageView imageView) {
    	System.out.println("url" + url);
        // 如果缓存过就会从缓存中取出图像,ImageCallback接口中方法也不会被执行  
        Drawable cacheImage = asyncImageLoader3.loadDrawable(url,  
                new AsyncImageLoader.ImageCallback() {  
                    // 请参见实现:如果第一次加载url时下面方法会执行  
                    @Override
					public void imageLoaded(Drawable imageDrawable) {  
                    	imageView.setImageDrawable(imageDrawable);
                    	//cacheImage = imageDrawable;
                    }

					@Override
					public Drawable returnImageLoaded(Drawable imageDrawable) {
						// TODO Auto-generated method stub
						return imageDrawable;
					} 
                });  
        if (cacheImage != null) {  
        	imageView.setImageDrawable(cacheImage); 
           }
        return cacheImage; 
    }  

仅供参考,欢迎纠错。



你可能感兴趣的:(android,exception,String,url,callback,工具)