關於網絡通訊方面,谷歌在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();
}
}
}
這樣一來,第二次點擊按鈕,圖片不會重複下載。