閱讀483 返回首頁    go 汽車大全


android圖片異步加載到本地

package com.example.health.util;

import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import android.content.Context;
import android.graphics.Bitmap;
import android.os.Handler;
import android.util.Log;

public class AsyncImageLoader {
	//保存正在下載的圖片URL集合,避免重複下載用
	private static HashSet<String> sDownloadingSet;
	//軟引用內存緩存
	private static Map<String,SoftReference<Bitmap>> sImageCache; 
	//圖片三種獲取方式管理者,網絡URL獲取、內存緩存獲取、外部文件緩存獲取
	private static LoaderImpl impl;
	//線程池相關
	private static ExecutorService sExecutorService;
	
	//通知UI線程圖片獲取ok時使用
	private Handler handler; 
	
	
	/**
	 * 異步加載圖片完畢的回調接口
	 */
	public interface ImageCallback{
		/**
		 * 回調函數
		 * @param bitmap: may be null!
		 * @param imageUrl 
		 */
		public void onImageLoaded(Bitmap bitmap, String imageUrl);
	}
	
	static{
		sDownloadingSet = new HashSet<String>();
		sImageCache = new HashMap<String,SoftReference<Bitmap>>();
		impl = new LoaderImpl(sImageCache);
	}

	public AsyncImageLoader(Context context){
		handler = new Handler();
		startThreadPoolIfNecessary();
		
		String defaultDir = context.getCacheDir().getAbsolutePath();
		setCachedDir(defaultDir);
	}
	
	/**
	 * 是否緩存圖片至/data/data/package/cache/目錄
	 * 默認不緩存
	 */
	public void setCache2File(boolean flag){
		impl.setCache2File(flag);
	}
	
	/**
	 * 設置緩存路徑,setCache2File(true)時有效
	 */
	public void setCachedDir(String dir){
		impl.setCachedDir(dir);
	}

	/**開啟線程池*/
	public static void startThreadPoolIfNecessary(){
		if(sExecutorService == null || sExecutorService.isShutdown() || sExecutorService.isTerminated()){
			sExecutorService = Executors.newFixedThreadPool(3);
			//sExecutorService = Executors.newSingleThreadExecutor();
		}
	}
	
	/**
	 * 異步下載圖片,並緩存到memory中
	 * @param url	
	 * @param callback	see ImageCallback interface
	 */
	public void downloadImage(final String url, final ImageCallback callback){
		downloadImage(url, true, callback);
	}
	
	/**
	 * 
	 * @param url
	 * @param cache2Memory 是否緩存至memory中
	 * @param callback
	 */
	public void downloadImage(final String url, final boolean cache2Memory, final ImageCallback callback){
		if(sDownloadingSet.contains(url)){
			Log.i("AsyncImageLoader", "###該圖片正在下載,不能重複下載!");
			return;
		}
		
		Bitmap bitmap = impl.getBitmapFromMemory(url);
		if(bitmap != null){
			if(callback != null){
				callback.onImageLoaded(bitmap, url);
			}
		}else{
			//從網絡端下載圖片
			sDownloadingSet.add(url);
			sExecutorService.submit(new Runnable(){
				@Override
				public void run() {
					final Bitmap bitmap = impl.getBitmapFromUrl(url, cache2Memory);
					handler.post(new Runnable(){
						@Override
						public void run(){
							if(callback != null)
								callback.onImageLoaded(bitmap, url);
							sDownloadingSet.remove(url);
						}
					});
				}
			});
		}
	}
	
	/**
	 * 預加載下一張圖片,緩存至memory中
	 * @param url 
	 */
	public void preLoadNextImage(final String url){
		//將callback置為空,隻將bitmap緩存到memory即可。
		downloadImage(url, null);
	}
	
}


 

 

 

    private void showImage(String imgUrl) {
        if(null==LoadingActivity.userList) {
        	image.setImageResource(images[2]);
        } else {
            //for test
            AsyncImageLoader loader = new AsyncImageLoader(getApplicationContext());
            
            //將圖片緩存至外部文件中
            loader.setCache2File(false);	//false
            //設置外部緩存文件夾
            loader.setCachedDir(this.getCacheDir().getAbsolutePath());
            
            //下載圖片,第二個參數是否緩存至內存中
            loader.downloadImage(imgUrl, true/*false*/, new AsyncImageLoader.ImageCallback() {
    			@Override
    			public void onImageLoaded(Bitmap bitmap, String imageUrl) {
    				if(bitmap != null){
    					image.setImageBitmap(bitmap);
    				}else{
    					//下載失敗,設置默認圖片
    					image.setImageResource(images[2]);
    				}
    			}
    		});
        }
    }


 

最後更新:2017-04-03 16:49:00

  上一篇:go ffmpeg入門之 Tutorial01
  下一篇:go Linux-0.0.1內核閱讀連載筆記-2013.08.22