HttpUrlConnection缓存,仿微信朋友圈图片缓存效果

关于网络通讯方面,谷歌在android6.0以后放弃了HttpClient,推荐使用HttpUrlConnection,然而HttpUrlConnection在API8以后就必须放在线程中了,这也是情理之中。

我们推荐使用缓存技术,可以实现微信朋友圈第二次点击同一张图片不用重复下载的效果。

本类用来判断从内存还是从网络取图片并下载


public class BitmapLoader {//辅助类
	//内存缓存,SoftReference软引用实现自动回收
	private static HashMap<String,SoftReference<Bitmap>> imageCache=new HashMap<String,SoftReference<Bitmap>>();
	
	/**
	 * 本方法自动判断从内存还是从网络取图片
	 * @param imageURL 图片路径
	 * @return 图片对象
	 */
	public static Bitmap loadBitmap(String imageURL){
		Bitmap bm=null;
		
		if(imageCache.containsKey(imageURL)){//若内存中存在,则从内存中取。containKey方法常被用来判断某元素在不在map中
			Log.i("BitmapLoader", "imageCache");
			SoftReference<Bitmap> reference=imageCache.get(imageURL);
			bm=reference.get();
		}
		if(null==bm){
			Log.i("BitmapLoader", "loadNetBitmao");
			bm=loadNetBitmap(imageURL);
			if(bm!=null){
				imageCache.put(imageURL, new SoftReference<Bitmap>(bm));//保存到内存
			}
		}
		
		return bm;
	}

	/**
	 * 从网络下载图片
	 * @param imageURL
	 * @return
	 */
	private static Bitmap loadNetBitmap(String imageURL) {
		try {
			
			URL url=new URL(imageURL);
			URLConnection connection;
			connection=url.openConnection();
			Bitmap bitmap=BitmapFactory.decodeStream((InputStream)connection.getContent());
			return bitmap;
		} catch (Exception e) {
		}
		return null;
	}

测试类

public class DownloadFileCache extends Activity   implements OnClickListener{
	private static final String params="http://XXX.XXX.XXX.XXX:8080/AndroidWebService/image/1.gif";
	private Button btnCache;
        private ProgressBar progress;
        private FrameLayout frameLayout;
        ProgressDialog dialog=null;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.download_file_cache);
		
		btnCache=(Button)this.findViewById(R.id.btnCache);
        progress=(ProgressBar)this.findViewById(R.id.progress); 
        progress.setVisibility(View.GONE);
        frameLayout=(FrameLayout)this.findViewById(R.id.frameLayout);
        
        btnCache.setOnClickListener(this);
	}

	@Override
	public void onClick(View view) {
		switch(view.getId()){
		case R.id.btnCache:
			dialog = ProgressDialog.show(this, "", 
                    "下载数据,请稍等 …", true, true); 
		 MyASyncTask yncTask=new MyASyncTask();
		 yncTask.execute(params);
			break;
		}
	}
	
	/**AsyncTask异步下载下载 **/
    public class MyASyncTask extends AsyncTask<String, Integer, Bitmap> {
    	
    	/**
    	 * 执行任务
    	 */
		@Override
		protected Bitmap doInBackground(String... params) {
			//调用缓存图片处理类
			Bitmap bitmap=BitmapLoader.loadBitmap(params[0]);//此处调用辅助类完成判断
	                return bitmap;
		}

		/**
		 * 返回任务执行的结果,通常更新UI
		 */
		@Override
		protected void onPostExecute(Bitmap result) {
			ImageView view=(ImageView)frameLayout.findViewById(R.id.image);
                        view.setImageBitmap(result);
                        dialog.dismiss();
		}
    }
	
}

这样一来,第二次点击按钮,图片不会重复下载。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章