关于网络通讯方面,谷歌在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();
}
}
}
这样一来,第二次点击按钮,图片不会重复下载。