Android 网络框架---Volley
/**
* Volley 可以同时请求多个,允许高并发
* 特性:
* 1、JSON、图片等的异步下载
* 2、网络请求的排序(Scheduling)
* 3、网络请求的优先级处理
* 4、缓存
* 5、多级别取消请求
* 6、和Activity的生命周期的联动(Activity结束时同时取消所有网络请求)
*
* 步骤:
* 1、拿到一个请求队列(RequestQueue只需要一个即可,不像AsyncTask每次使用都要new一个).
* 这个请求队列对象,可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。RequestQueue内部的设计就是非常适合高并发的。
* 因此我们不必为每一个HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。
* RequestQueue queue = Volley.newRequestQueue(this);
* 2、实现Volley的异步请求类(JsonObjectRequest,JsonArrayRequest,StringRequest,ImageRequest)
*/
1 public class MainActivity extends AppCompatActivity { 2 3 ImageView iv; 4 NetworkImageView iv_network; 5 RequestQueue queue; 6 @Override 7 protected void onCreate(Bundle savedInstanceState) { 8 super.onCreate(savedInstanceState); 9 setContentView(R.layout.activity_main); 10 iv = (ImageView) findViewById(R.id.iv); 11 iv_network = (NetworkImageView) findViewById(R.id.iv_network); 12 13 queue = Volley.newRequestQueue(getApplicationContext());//或者用getApplicationContext() 14 } 15 16 17 private Response.ErrorListener errorListener = new Response.ErrorListener() { 18 @Override 19 public void onErrorResponse(VolleyError error) { 20 Log.e("TAG","请求错误"); 21 } 22 }; 23 24 public void net1(View v){ 25 //第一个参数就是目标服务器的URL地址,第二个参数是服务器响应成功的回调,第三个参数是服务器响应失败的回调 26 //默认GET请求 27 StringRequest request = new StringRequest("http://www.baidu.com", new Response.Listener<String>() { 28 @Override 29 public void onResponse(String response) { 30 Log.e("TAG","----response:"+response.toString()); 31 } 32 },errorListener); 33 34 //将请求添加到队列中 35 queue.add(request); 36 } 37 38 public void net2(View v){ 39 //HTTP请求方式使用POST, 40 //StringRequest中并没有提供设置POST参数的方法, 41 //但是当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数, 42 //我们只需要在StringRequest的匿名类中重写getParams()方法,在这里设置POST参数就可以了 43 StringRequest request = new StringRequest(Request.Method.POST, "http://route.showapi.com/109-35", new Response.Listener<String>() { 44 @Override 45 public void onResponse(String response) { 46 Log.e("TAG","---->response"+response.toString()); 47 } 48 },errorListener){ 49 @Override 50 protected Map<String, String> getParams() throws AuthFailureError { 51 Map<String,String> map = new HashMap<>(); 52 map.put("showapi_appid","27306"); 53 map.put("showapi_sign","150e9206e7f542bab4affe49d73cb920"); 54 return map; 55 } 56 }; 57 58 queue.add(request); 59 } 60 61 public void net3(View v){ 62 //类似于StringRequest,JsonRequest也是继承自Request类的,不过由于JsonRequest是一个抽象类,因此我们无法直接创建它的实例。 63 //JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest 64 65 //注意这里是拿不到数据的。 66 //jsonRequest为null,重写getParams()然而并没有什么用 67 //JsonObjectRequest的几个坑,详情见http://blog.csdn.net/onlysnail/article/details/47905375 68 JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, "http://route.showapi.com/109-35", null, new Response.Listener<JSONObject>() { 69 @Override 70 public void onResponse(JSONObject response) { 71 Log.e("TAG","----response"+response.toString()); 72 } 73 }, errorListener){ 74 @Override 75 protected Map<String, String> getParams() throws AuthFailureError { 76 Map<String,String> map = new HashMap<>(); 77 map.put("showapi_appid","27306"); 78 map.put("showapi_sign","150e9206e7f542bab4affe49d73cb920"); 79 return map; 80 } 81 }; 82 queue.add(request); 83 } 84 85 public void net4(View v){ 86 87 ImageRequest request = new ImageRequest("https://ss1.baidu.com/6ONXsjip0QIZ8tyhnq/it/u=1858172584,1668311861&fm=80&w=179&h=119&img.JPEG", new Response.Listener<Bitmap>() { 88 @Override 89 public void onResponse(Bitmap response) { 90 iv.setImageBitmap(response); 91 } 92 //防止OOM, 图像裁剪,品质压缩,三级缓存 93 //允许图片最大的宽高,可调,压缩比率为0的话就表示不管图片有多大,都不会压缩 94 },200,200, ImageView.ScaleType.FIT_XY, Bitmap.Config.RGB_565,errorListener); 95 96 queue.add(request); 97 } 98 99 public void net5(View v){ 100 101 ImageLoader loader = new ImageLoader(queue, new ImageLoader.ImageCache() { 102 /** 103 * LruCache原理:Cache保存一个强引用来限制内容数量。每当Item被访问的时候,此Item就会移动到队列的头部。 104 * 当cache已满的时候加入新的item时,在队列尾部的item会被回收。 105 * 解释:当超出指定内存值则移除最近最少用的图片内存 106 * 拿到内存的八分之一来做图片内存缓存 107 */ 108 LruCache<String,Bitmap> bitmapLruCache = new LruCache<String,Bitmap>((int) (Runtime.getRuntime().maxMemory()/8)){ 109 @Override 110 protected int sizeOf(String key, Bitmap value) { 111 return value.getByteCount(); 112 } 113 }; 114 115 @Override 116 public Bitmap getBitmap(String url) { 117 return bitmapLruCache.get(url); 118 } 119 120 @Override 121 public void putBitmap(String url, Bitmap bitmap) { 122 bitmapLruCache.put(url,bitmap); 123 } 124 125 }); 126 127 loader.get("https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=2519065955,952826078&fm=80&w=179&h=119&img.JPEG", new ImageLoader.ImageListener() { 128 @Override 129 public void onResponse(ImageLoader.ImageContainer response, boolean isImmediate) { 130 iv.setImageBitmap(response.getBitmap()); 131 } 132 133 @Override 134 public void onErrorResponse(VolleyError error) { 135 136 } 137 }); 138 139 } 140 141 142 public void net6(View v){ 143 ImageLoader loader = new ImageLoader(queue, new ImageLoader.ImageCache() { 144 LruCache<String,Bitmap> cache = new LruCache<String,Bitmap>((int) (Runtime.getRuntime().maxMemory()/8)){ 145 @Override 146 protected int sizeOf(String key, Bitmap value) { 147 return value.getByteCount(); 148 } 149 }; 150 151 @Override 152 public Bitmap getBitmap(String url) { 153 return cache.get(url); 154 } 155 156 @Override 157 public void putBitmap(String url, Bitmap bitmap) { 158 cache.put(url,bitmap); 159 } 160 }); 161 162 /** 163 * NetworkImageView是一个自定义控件,继承自ImageView,封装了请求网络加载图片功能 164 * NetworkImageView并没有提供设置最大宽高的方法,根据我们设置空间的宽高结合网络图片的宽高内部会自动去实现压缩 165 * 如果我们不想要压缩,可以设置NetworkImageView控件的宽高都为wrap_content 166 * 现在xml布局中引用 167 */ 168 iv_network.setImageUrl("https://ss2.baidu.com/6ONYsjip0QIZ8tyhnq/it/u=214772963,3279795725&fm=80&w=179&h=119&img.JPEG",loader); 169 } 170 }