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

這樣一來,第二次點擊按鈕,圖片不會重複下載。



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