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 }
MainActivity.java
 
原文地址:https://www.cnblogs.com/Claire6649/p/6074818.html