本帖最后由 孟凡凯老师 于 2016-5-5 00:48 编辑
背景 android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient(Android 6.0 已被废除),然而用法还是稍微复杂的,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。简单来说Volley就是集AsyncHttpClient和Universal-Image-Loader的优点于一身。 提到这个AsyncHttpClient和Universal-Image-Loader,简单说一下 AsyncHttpClient 是针对Android在Apache的HttpClient基础上构建的异步的callback-based http client,请求全在UI线程之外发生,而callback发生在创建它的线程中,应用了Android的Handler发送消息机制。也可以把AsyncHttpClient应用在Service中或者后台线程中,库代码会自动识别出它所运行的context。具体请求细节全部封装在内部,开发者只需要简简单单几行代码就能搞定网络请求。 Universal-Image-Loader针对图片的错乱,OOM等问题,开发者也不用关心如何从网络上获取图片,开启线程、回收图片资源等细节 应用场景 Volley适用于交互频繁但是数据量小的网络请求,但是对于一些数据量大的网络请求,比如下载,Volley就比较糟糕可以使用oKHttp代替。 Volley的特点? 1. 多个并发的网络连接 2. 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致 3. 网络请求的优先级处理 4. 支持取消请求的强大API,可以取消单个请求或多个 5. 易于定制 6. 壮性:便于正确的更新UI和获取数据 7. 包含调试和追踪工具 下载Volley 1. 如果电脑上有git, 如果你的电脑上装有Git, 如下命令下载Volley的源码: git clone https://android.googlesource.com/platform/frameworks/volley
Volley的使用:
StringRequest的用法 Get请求方式: - String url = "http://www.baidu.com";
- RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
- StringRequest request = new StringRequest(url, new Response.Listener<String>() {
- @Override
- public void onResponse(String response) {
- //服务器成功后回调
- Log.i("NetWork", response);
- }
- }, new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- //服务器失败后回调
- Log.e("NetWork", error.getMessage());
- }
- });
- mQueue.add(request);
复制代码1.获取一个请求队列 2.创建一个请求对象,传入的三个参数,第一个是需要请求的URL地址,第二个是请求服务器成功后的回调,第三个是请求服务器失败后的回调。 3.将请求对象加入到请求队列中。 Post请求方式: 通过Request的另一个构造方法,第一个参数传入请求数据的方式,但是volley并没有给我们提供设置POST参数的方法,通过看源码发现StringRequest继承自Request, Request中有一个getParams()方法, POST或者PUT的请求参数保存在Map对象中,因此我们可以重写Request中的getParams()方法将请求参数添加到Map集合中并返回。 - /**
- * Returns a Map of parameters to be used for a POST or PUT request. Can throw
- * {@link AuthFailureError} as authentication may be required to provide these values.
- *
- * <p>Note that you can directly override {@link #getBody()} for custom data.</p>
- *
- * @throws AuthFailureError in the event of auth failure
- */
- protected Map<String, String> getParams() throws AuthFailureError {
- return null;
- }
复制代码- RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
- String url = "http://www.baidu.com";
- StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
- @Override
- public void onResponse(String response) {
- //服务器成功后回调
- Log.i("NetWork", response);
- }
- }, new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- //服务器失败后回调
- Log.e("NetWork", error.getMessage());
- }
- }){
- @Override
- protected Map<String, String> getParams() throws AuthFailureError {
- Map<String, String> map = new HashMap<String, String>();
- map.put("username","value");
- map.put("password","value");
- return map;
- }
- };
- mQueue.add(request);
复制代码1.获取一个请求队列 2.创建一个请求对象,传入的四个参数,第一个是请求方法,第二个是需要请求的URL地址,第三个是请求服务器成功后的回调,第四个是请求服务器失败后的回调。 3.重写Request中的getParams()方法将请求参数添加到Map集合中 4.将请求对象加入到请求队列中。
JsonRequest的用法 JsonRequest是一个抽象类,只能创建JSONRequest的子类。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,一个是返回一段JSON数据的,一个是返回一段JSON数组的。JsonObjectRequest的用法和StringRequest的用法基本上是完全一样的。 - RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
- String url = "http://www.baidu.com";
- JsonObjectRequest request = new JsonObjectRequest(url, new Response.Listener<JSONObject>() {
- @Override
- public void onResponse(JSONObject response) {
- //服务器成功后回调
- Log.i("NetWork", response);
- }
- }, new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- //服务器失败后回调
- Log.e("NetWork", error.getMessage());
- }
- })};
- mQueue.add(request);
复制代码 ImageRequest的用法- RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
- String url = "http://www.baidu.com";
- ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {
- @Override
- public void onResponse(Bitmap response) {
- //服务器成功后回调
- Log.i("NetWork", response);
- }
- }, 0, 0, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError error) {
- //服务器失败后回调
- Log.e("NetWork", error.getMessage());
- }
- });
- mQueue.add(request);
复制代码1.获取一个请求队列 2.创建一个请求对象,传入的六个参数,第一个是需要请求的URL地址,第二个是请求服务器成功后的回调,第三个第四个是图片最大宽高,如果宽高设置为0不会对图片的大小做任何处理如果设置了图片的宽高,图片会根据设置的宽高进行缩放,第五个是图片的Config配置,第六个是请求服务器失败后的回调。 3.将请求对象加入到请求队列中。
ImageLoad的用法:- RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
- ImageLoader mImageLoader = new ImageLoader(mQueue, new VolleyImageCache ());
- ImageLoader.ImageListener listener = mImageLoader.getImageListener(mImageView, default_image, failed_image);
- mImageLoader.get(url, listener, 0,0);
复制代码 Volley内部给我们提供了Imageload用来加载图片。以上是使用Volley内部的ImageLoad的主要步骤:
1.获取RequestQueue请求队列
2.创建一个ImageLoad类,需要传入两个参数,第一个是RequestQueue请求队列对象,第二个参数是一个ImageCache对象(代码在下方)。
3 .获取一个ImageListener监听器对象。需要传入三个参数,第一个参数指定用于显示图片的ImageView控件,第二个参数是加载图片的过程中显示的图片,第三个参数是加载图片失败的情况下显示的图片。
4. 调用ImageLoader的get()方法来加载图片,需要传入四个参数,第一个是加载图片的URL的地址,第二个参数是ImageListener监听器对象,第三个和第四个参数是图片最大宽高,如果宽高设置为0不会对图片的大小做任何处理如果设置了图片的宽高,图片会根据设置的宽高进行缩放。
- public class VolleyImageCache implements ImageLoader.ImageCache {
- private LruCache<String, Bitmap> mLruCache;
- public VolleyImageCache() {
- //maxSize : 缓存的大小,一般是存储空间的八分之一
- int maxSize = (int) Runtime.getRuntime().maxMemory() / 8;
- mLruCache = new LruCache<String, Bitmap>(maxSize) {
- //获取移出图片的大小,因为图片从缓存中移出后,缓存要知道释放多少空间
- @Override
- protected int sizeOf(String key, Bitmap value) {
- //value.getRowBytes() : 图片占用一行的空间大小
- //value.getHeight() : 图片占用行数
- return value.getRowBytes() * value.getHeight();
- }
- };
- }
- @Override
- public Bitmap getBitmap(String url) {
- return mLruCache.get(url);
- }
- @Override
- public void putBitmap(String url, Bitmap bitmap) {
- mLruCache.put(url, bitmap);
- }
- }
复制代码
NetworkImageView的用法 Volley的另一种图片加载的方式NetworkImageView ,这是一个继承ImageView的控件,加载网络图片,自动压缩图片的功能。 - <com.android.volley.toolbox.NetworkImageView
- android:id="@+id/network_image_view"
- android:layout_width=" wrap_content"
- android:layout_height=" wrap_content "/>
复制代码- NetworkImageView mNetworkImageView = (NetworkImageView) findViewById(R.id.network_image_view);
- mNetworkImageView .setDefaultImageResId(R.drawable.default_image);
- mNetworkImageView .setErrorImageResId(R.drawable.failed_image);
- networkImageView.setImageUrl(mUrl, mImageLoader);
复制代码1. 首先需要在布局中添加NetworkImageView这个控件
2.在代码中找到NetworkImageView控件 3. 通过setDefaultImageResId(),setErrorImageResId(),分别设置图片加载中显示的图片和加载失败时显示的图片
4.通过setImageUr()方法设置需要加载的网络图片,需要传入两个参数,第一个是URL地址,第二个是一个ImageLoard对象
自定义Volley详情见链接:http://blog.csdn.net/guolin_blog/article/details/17612763
Volley源码解析见链接:http://blog.csdn.net/yanbober/article/details/45307217
|