Android 網絡框架---Volley


/**
* Volley 能夠同時請求多個,容許高併發
* 特性:
* 一、JSON、圖片等的異步下載
* 二、網絡請求的排序(Scheduling)
* 三、網絡請求的優先級處理
* 四、緩存
* 五、多級別取消請求
* 六、和Activity的生命週期的聯動(Activity結束時同時取消全部網絡請求)
*
* 步驟:
* 一、拿到一個請求隊列(RequestQueue只須要一個便可,不像AsyncTask每次使用都要new一個).
* 這個請求隊列對象,能夠緩存全部的HTTP請求,而後按照必定的算法併發地發出這些請求。RequestQueue內部的設計就是很是適合高併發的。
* 所以咱們沒必要爲每個HTTP請求都建立一個RequestQueue對象,這是很是浪費資源的,基本上在每個須要和網絡交互的Activity中建立一個RequestQueue對象就足夠了。
* RequestQueue queue = Volley.newRequestQueue(this);
* 二、實現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
相關文章
相關標籤/搜索