`

图片加载与缓存

阅读更多

      在android开发中我们要进行网络交互请求数据时,避免不了对图片的加载与缓存。下面讲下我用到的方法:

   一.运用DisplayImageOption加载。运用架包再进行配置就行(架包已上传)。

 

       //加载图片
	public static void getview(String icon_path,ImageView imageview){
		 ImageLoader loader=ImageLoader.getInstance();
                 //图片请求路径给ImageView设置图片
		 loader.displayImage("http://192.168.0.107:8080/LaQuan/"+icon_path, imageview);

   在application中创建DisplayImageOption加载

 

     

public void onCreate() {
		super.onCreate();
		//加载并缓存图片配置
		 // 使用DisplayImageOptions.Builder()创建DisplayImageOptions
		DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                 .cacheInMemory()  //1.8.6包使用时候,括号里面传入参数true 设置下载的图片是否缓存在内存中
                 .cacheOnDisc()    //1.8.6包使用时候,括号里面传入参数true 设置下载的图片是否缓存在SD卡中
                 .build();
	ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext())
       .defaultDisplayImageOptions(defaultOptions)
       .threadPriority(Thread.NORM_PRIORITY - 2)
       .denyCacheImageMultipleSizesInMemory()
       .discCacheFileNameGenerator(new Md5FileNameGenerator())
       .tasksProcessingOrder(QueueProcessingType.LIFO)
	.build();
	  ImageLoader.getInstance().init(config);
	   map=new HashMap<String, Object>();
	}

 

 

    二.通过异步任务加载图片保存到缓存

       

;
    private  LruCache<String,Bitmap> mLruCache;
    final int maxSize=(int) Runtime.getRuntime().maxMemory(); //运行时最大内存
    final int cacheSize=maxSize/5;   //设置将最大内存的五分之一用于缓存
     public TuanAdapter(ArrayList<Goods> list, Context context) {
	super();		
	 mLruCache=new LruCache<String,Bitmap>(cacheSize){
	  protected int sizeOf(String key, Bitmap value) {
	     return value.getByteCount()/1024;
			}
	 };
   }
//通过路劲异步加载图片并给ImageView设置图片
  public void lodadBitmap(ImageView imageview,String url){
		Bitmap bitmap=null;
		GetImageAsyncTask asyncTask=new GetImageAsyncTask(imageview,mLruCache);
		bitmap=asyncTask.getBitmapFromMemoryCache(url);
		if(bitmap!=null){  //如果缓存中有图片就直接给ImageView设置
			imageview.setImageBitmap(bitmap);
		}else{    //如果缓存中没有图片就进行异步加载
			imageview.setImageResource(R.drawable.ic_launcher);
			asyncTask.execute(url); //通过路劲启动异步加载
		}
	}
 

    异步加载类

   

public class GetImageAsyncTask extends AsyncTask<String,Integer,Bitmap>{
		private ImageView mImageView;
		private LruCache<String,Bitmap> mLruCache;
	 public GetImageAsyncTask(ImageView mImageView,LruCache<String,Bitmap> mLruCache) {
			super();
			this.mImageView = mImageView;
			this.mLruCache=mLruCache;
	}
           		//异步加载图片��̨ ����
		@Override
		protected Bitmap doInBackground(String... url) {
			Bitmap mBitmap=null;
			try {
				URL imgUrl=new URL(url[0]);
				InputStream is=imgUrl.openConnection().getInputStream();
				mBitmap=BitmapFactory.decodeStream(is);
				addBitmapToMemoryCache(url[0],mBitmap);			
			} catch (IOException e) {
				e.printStackTrace();
			}
			return mBitmap;
		}
              //从内存获取图片
		public Bitmap getBitmapFromMemoryCache(String key){
			return mLruCache.get(key);
		}
               //将图片保存至内存
		public void addBitmapToMemoryCache(String key,Bitmap bitmap){
			if(mLruCache.get(key)==null){
				mLruCache.put(key, bitmap);
			}
              	}
                //异步加载后调用方法�ִ��
		@Override
		protected void onPostExecute(Bitmap result) {
			super.onPostExecute(result);
			mImageView.setImageBitmap(result);
		}		
	 }

 三.运用Google提供Volley架包进行图片的获取与缓存

public class BitmapLruCache implements ImageCache  {
	private LruCache<String, Bitmap> mCache;
    public BitmapLruCache(){
    	//设置最大缓存为10M
    	int maxCache=10*1024*1024;
    	mCache = new LruCache<String, Bitmap>(maxCache) {
			@Override
			protected int sizeOf(String key, Bitmap value) {
				return value.getRowBytes() * value.getHeight();
			}
		};
    }
       //从缓存获取图片
	@Override
	public Bitmap getBitmap(String url) {
		return mCache.get(url);
	}
        //将图片存入缓存
	@Override
	public void putBitmap(String url, Bitmap bitmap) {
		mCache.put(url, bitmap);
	}

 

public class App extends Application {
	/**
	 * 整个App的图片内存缓存类
	 */
	public static BitmapLruCache bitmapLruCache;
	/**
	 * 整个App内AVOS相关类要用到的RequestQueue
	 */
	public static RequestQueue requestQueue;
	@Override
	public void onCreate() {
		super.onCreate();	
        	requestQueue=Volley.newRequestQueue(getApplicationContext());
		bitmapLruCache=new BitmapLruCache();
		 
	}
}

 

   ImageLoader	imageLoader=new ImageLoader(App.requestQueue, App.bitmapLruCache);
   //给ImageView设置图片(imgurl为图片路径)
   holder.img.setImageUrl(imgurl,imageLoader);

 

 

 

      

  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics