HttpURLConnection,HttpClient,Volley(4)

Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架。在 Google I/O 2013 大会上发布。它简化了http操作,并且加入了对异步加载图片的使用。Volley的实现中同样提供了上面提到的HttpURLConnection和HttpClient可供选择定制。官方推荐在API level = 9之前使用HttpClient,而之后使用HttpURLConnection。
具体使用的官方教程请参考:

对于Volley的代码实现解析请参考:
“ 源码解析”

Volley加载图片

虽然对于Volley来说,加载图片轻而易举,甚至它还提供了NetworkImageView这个自定义的ImageView来简化这一操作:

//将Layout中的ImageView转换为networkImageView networkImageView = (NetworkImageView) findViewById(R.id.network_image_view); //快速创建一个默认的RequestQueue(处理request的队列,一般一个Application只需要维护一个单例,这里简化了代码) mQueue = Volley.newRequestQueue(this); //创建一个ImageCache缓存,ImageCache是ImageLoader内的一个接口,需要自己去实现它 MyImageCache mImageCache = MyImageCache.instance(); //根据上面两个实例创建一个ImageLoader,ImageLoader是Volley里提供的简化图像加载的类 ImageLoader imageLoader = new ImageLoader(mQueue,mImageCache); //设定NetworkImageView默认情况下和出错情况下的图片样式 networkImageView.setDefaultImageResId(R.drawable.ic_launcher); networkImageView.setErrorImageResId(R.drawable.ic_launcher); //设定NetworkImageView的URL地址,和辅助的ImageLoader。 //调用完该语句后,会通过ImageLoader首先从ImageCache中找是否有缓存的图片,如果有就显示 //没有就通过网络下载图片并加载 networkImageView.setImageUrl(linuxidcImage, imageLoader);

上面的ImageCache可以参考官方实现,摘要如下:

new ImageLoader.ImageCache() { private final LruCache<String, Bitmap> cache = new LruCache<String, Bitmap>(20); @Override public Bitmap getBitmap(String url) { return cache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { cache.put(url, bitmap); } });

1

如果有一个问题就是其是在内存中做的缓存,当请求的图片过大的时候,容易发生OOM问题,而且缓存也不可能做的过大,所以自己实现的时候可以实现一个Disk+内存双重缓存的方式来做,做一个LruMemCache和LruDiskCache,在LruMemCache满了的时候trim到LruDiskCache。get的时候先从LruMemCache找,找不到则从ruDiskCache中找,再找不到则从网络下载,并加入到LruMemCache中。
说到底Volley并不是专门设计用来下载加载网络图片的。如果有大量图片加载任务,可以考虑使用Android-Universal-Image-Loader (https://github.com/nostra13/Android-Universal-Image-Loader) 它在内存缓存和硬盘缓存的管理做的更好。

Volley更擅长的是将一系列各种请求加入到异步网络请求队列。大大的提高了网络请求的销量和使用的便捷性,比如JsonReques。StringRequest。而不是通过HttpURLConnection,然后我们自己管理多线程,内存溢出这些问题。

Volley获取天气

使用中国天气网的接口来获取Json数据,然后解析天气内容并显示
接口地址:城市代码.html
以北京为例,接口地址为:
返回数据为:

{ "weatherinfo": { "city": "北京", // 城市中文名 "cityid": "101010100", // 城市 ID "temp1": "22℃", // ? "temp2": "31℃", // ? "weather": "阴转晴", // 天气 "img1": "n2.gif", // ? 天气图标编号 "img2": "d0.gif", // ? 天气图标编号 "ptime": "18:00" // 发布时间 } }

实现思路:
1,界面显示ListView。分别显示不同城市的天气状况,每个Item只显示城市名称,高低气温,天气状况,发布时间。
2,刷新时通过Volley发送JsonRequest,并根据返回的Response更新天气信息。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/bbb2a0b66b66e00712b3a71d4a856c84.html