A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 孟凡凯老师 于 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  
2.   或者下载jar包:https://github.com/mcxiaoke/android-volley

Volley的使用:

  StringRequest的用法
     Get请求方式:
  1. String url = "http://www.baidu.com";
  2. RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());  
  3. StringRequest request = new StringRequest(url, new Response.Listener<String>() {
  4.      @Override
  5.      public void onResponse(String response) {
  6.           //服务器成功后回调
  7.           Log.i("NetWork", response);
  8.      }
  9. }, new Response.ErrorListener() {
  10.      @Override
  11.      public void onErrorResponse(VolleyError error) {
  12.           //服务器失败后回调
  13.           Log.e("NetWork", error.getMessage());
  14.      }
  15. });
  16. mQueue.add(request);
复制代码
1.获取一个请求队列
2.创建一个请求对象,传入的三个参数,第一个是需要请求的URL地址,第二个是请求服务器成功后的回调,第三个是请求服务器失败后的回调。
3.将请求对象加入到请求队列中。
     Post请求方式:
    通过Request的另一个构造方法,第一个参数传入请求数据的方式,但是volley并没有给我们提供设置POST参数的方法,通过看源码发现StringRequest继承自Request, Request中有一个getParams()方法, POST或者PUT的请求参数保存在Map对象中,因此我们可以重写Request中的getParams()方法将请求参数添加到Map集合中并返回。
  1. /**
  2. * Returns a Map of parameters to be used for a POST or PUT request.  Can throw
  3. * {@link AuthFailureError} as authentication may be required to provide these values.
  4. *
  5. * <p>Note that you can directly override {@link #getBody()} for custom data.</p>
  6. *
  7. * @throws AuthFailureError in the event of auth failure
  8. */
  9. protected Map<String, String> getParams() throws AuthFailureError {
  10.      return null;
  11. }
复制代码
  1. RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());  
  2. String url = "http://www.baidu.com";
  3. StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
  4.      @Override
  5.      public void onResponse(String response) {
  6.           //服务器成功后回调
  7.           Log.i("NetWork", response);
  8.      }
  9. }, new Response.ErrorListener() {
  10.      @Override
  11.      public void onErrorResponse(VolleyError error) {
  12.           //服务器失败后回调
  13.          Log.e("NetWork", error.getMessage());
  14.      }
  15. }){
  16.      @Override
  17.      protected Map<String, String> getParams() throws AuthFailureError {
  18.           Map<String, String> map = new HashMap<String, String>();
  19.           map.put("username","value");
  20.          map.put("password","value");
  21.          return map;
  22.      }
  23. };
  24. mQueue.add(request);
复制代码
1.获取一个请求队列
2.创建一个请求对象,传入的四个参数,第一个是请求方法,第二个是需要请求的URL地址,第三个是请求服务器成功后的回调,第四个是请求服务器失败后的回调。
3.重写Request中的getParams()方法将请求参数添加到Map集合中
4.将请求对象加入到请求队列中。

  JsonRequest的用法
    JsonRequest是一个抽象类,只能创建JSONRequest的子类。JsonRequest有两个直接的子类,JsonObjectRequestJsonArrayRequest,一个是返回一段JSON数据的,一个是返回一段JSON数组的。JsonObjectRequest的用法和StringRequest的用法基本上是完全一样的。
  1. RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());  
  2. String url = "http://www.baidu.com";
  3. JsonObjectRequest request = new JsonObjectRequest(url, new Response.Listener<JSONObject>() {
  4.      @Override
  5.      public void onResponse(JSONObject response) {
  6.           //服务器成功后回调
  7.           Log.i("NetWork", response);
  8.      }
  9. }, new Response.ErrorListener() {
  10.      @Override
  11.      public void onErrorResponse(VolleyError error) {
  12.           //服务器失败后回调
  13.           Log.e("NetWork", error.getMessage());
  14.      }
  15. })};
  16. mQueue.add(request);
复制代码
  ImageRequest的用法
  1. RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());  
  2. String url = "http://www.baidu.com";
  3. ImageRequest request = new ImageRequest(url, new Response.Listener<Bitmap>() {
  4.      @Override
  5.      public void onResponse(Bitmap response) {
  6.           //服务器成功后回调
  7.           Log.i("NetWork", response);
  8.      }
  9. }, 0, 0, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
  10.      @Override
  11.      public void onErrorResponse(VolleyError error) {
  12.           //服务器失败后回调
  13.           Log.e("NetWork", error.getMessage());        
  14.      }
  15. });
  16. mQueue.add(request);
复制代码
1.获取一个请求队列
2.创建一个请求对象,传入的六个参数,第一个是需要请求的URL地址,第二个是请求服务器成功后的回调,第三个第四个是图片最大宽高,如果宽高设置为0不会对图片的大小做任何处理如果设置了图片的宽高,图片会根据设置的宽高进行缩放,第五个是图片的Config配置,第六个是请求服务器失败后的回调。
3.将请求对象加入到请求队列中。

ImageLoad的用法:
  1. RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());  
  2. ImageLoader mImageLoader = new ImageLoader(mQueue, new VolleyImageCache ());
  3. ImageLoader.ImageListener listener = mImageLoader.getImageListener(mImageView, default_image, failed_image);
  4. 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不会对图片的大小做任何处理如果设置了图片的宽高,图片会根据设置的宽高进行缩放。
  1. public class VolleyImageCache implements ImageLoader.ImageCache {

  2.     private LruCache<String, Bitmap> mLruCache;
  3.     public VolleyImageCache() {
  4.         //maxSize : 缓存的大小,一般是存储空间的八分之一
  5.         int maxSize = (int) Runtime.getRuntime().maxMemory() / 8;
  6.         mLruCache = new LruCache<String, Bitmap>(maxSize) {
  7.             //获取移出图片的大小,因为图片从缓存中移出后,缓存要知道释放多少空间
  8.             @Override
  9.             protected int sizeOf(String key, Bitmap value) {
  10.                 //value.getRowBytes() : 图片占用一行的空间大小
  11.                 //value.getHeight() : 图片占用行数
  12.                 return value.getRowBytes() * value.getHeight();
  13.             }
  14.         };
  15.     }
  16.     @Override
  17.     public Bitmap getBitmap(String url) {
  18.         return mLruCache.get(url);
  19.     }

  20.     @Override
  21.     public void putBitmap(String url, Bitmap bitmap) {
  22.         mLruCache.put(url, bitmap);
  23.     }
  24. }
复制代码

  NetworkImageView的用法
Volley的另一种图片加载的方式NetworkImageView  ,这是一个继承ImageView的控件,加载网络图片,自动压缩图片的功能。
  1. <com.android.volley.toolbox.NetworkImageView   
  2.               android:id="@+id/network_image_view"  
  3.               android:layout_width=" wrap_content"  
  4.                android:layout_height=" wrap_content "/>  
复制代码
  1. NetworkImageView  mNetworkImageView = (NetworkImageView) findViewById(R.id.network_image_view);
  2. mNetworkImageView .setDefaultImageResId(R.drawable.default_image);  
  3. mNetworkImageView .setErrorImageResId(R.drawable.failed_image);  
  4. 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


1 个回复

倒序浏览
先学习了{:2_30:}
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马