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

参考までに、誤り訂正を歓迎します.