<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ***** **Volley網絡框架** [TOC=6] 1、Volley?是什么? 2、Volley?如何接入,源代碼怎么獲取?? 一、Volley是什么? Volley是HTTP庫,使得Android應用的網絡操作更容易,尤其重要的是,相比較于普通Android?網絡Api速度更快、也更優雅。 二、Volley具有如下優點: 網絡請求的自動調度:擁有調度線程池 多個并發的網絡連接:擁有請求緩存池 緩存設計遵循?Cache?Coherence 支持請求優先級管理。 取消請求API。取消單個請求,也支持按照Tag來配置請求取消的區域或范圍。 面向接口編程:框架靈活、易于定制,例如,重試機制 強序關系使得很容易的通過異步方式從網絡正確的得到數據,填充到UI界面上。 調試和跟蹤工具:VolleyLog、VolleyLog#VolleyLog等 .使用Volley 1.Volley的網絡請求隊列建立與取消隊列請求 使用Volley需要建立一個全局的請求隊列,這樣我們就可以將一個請求加入到這個全局隊列中,并可以管理整個APP的所有請求,包括取消一個或所有的請求。 2.Volley的Get和Post請求方式的使用 Volley的Get和Post請求方式其實是對Android原生Get和Post請求方式進行了二次封裝,對效率等進行優化。在使用Get和Post請求方式之前,我們要確定所請求的數據返回什么對象,Volley自帶了三種返回類型: StringRequest:主要使用在對請求數據的返回類型不確定的情況下; ImageRequest:主要使用在請求圖片; JsonRequest:主要請求JSON數據; * JsonObjectRequest:請求Json對象 * JsonArrayRequest:請求Json數組 3.Volley與Activity生命周期的聯動 簡單來說就是Volley中的請求是與Activity的生命周期進行關聯。這樣可以在Android銷毀時關閉Volley的請求,防止請求在后臺運行造成內存溢出等情況發生。與Activity生命周期進行聯動時需要設置Tag標簽,因為取消請求需要在請求隊列中通過Tag標簽進行查找,在Activity的onStop中執行取消請求的操作。 下面通過代碼進行實例的演示。 使用 第一步添加網絡權限 ???添加依賴 ~~~ implementation?'com.mcxiaoke.volley:library:1.0.19' ~~~ 第二步?初始化volley ~~~ 第一種在Application中寫RequestQueue對象。 存在的問題,請求隊列在Application類中,請求對象封裝在工具類中,代碼分別在兩部分中。 MyApplication.java publicclass?MyApplication?extends?Application{ ???? privatestatic?RequestQueue?queues?; ?? @Override ???? publicvoid?onCreate()?{ ??????? super.onCreate(); ???????? queues?=?Volley.newRequestQueue(getApplicationContext()); ??? ? } ???? public static?RequestQueue?getHttpQueues()?{ ????????return?queues; ?? ? } } ~~~ ~~~ 第二種:都放在工具類中 public class VolleyHttpImpl implements HttpUtil { private static VolleyHttpImpl instance = null; private RequestQueue queue; /** * 構造方法 * @param context */ private VolleyHttpImpl(Context context) { if (context == null) { throw new IllegalArgumentException("初始化的時候,content不能是null"); } queue = Volley.newRequestQueue(context); } /** * 創建VolleyHttpImpl對象 * @param context * @return */ public static VolleyHttpImpl create(Context context) { if (instance == null) { synchronized (VolleyHttpImpl.class) { instance = new VolleyHttpImpl(context); } } return instance; } /** * 獲取VolleyHttpImpl對象 * @return */ public static VolleyHttpImpl getInstance() { return create(null); } /** * 根據tag關閉請求 */ public void cancelAll(String tag) { queue.cancelAll(tag); } } ~~~ ?第三步通過請求方式寫網絡請求方法 Get方式請求數據返回StringRequest對象 ~~~ private?void?volleyGet()?{ ????????String?url?=?"https://tcc.taobao.com/cc/json/mobile_tel_segment.htm?tel=15850781443"; ????????StringRequest?request?=?new?StringRequest(Method.GET,?url, ????????????????new?Listener<String>()?{ ????????????????????@Override ????????????????????public?void?onResponse(String?s)?{//s為請求返回的字符串數據 ????????????????????????Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show(); ????????????????????} ????????????????}, ????????????????new?ErrorListener()?{ ????????????????????@Override ????????????????????public?void?onErrorResponse(VolleyError?volleyError)?{ ????????????????????????Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show(); ????????????????????} ????????????????}); ????????//設置請求的Tag標簽,可以在全局請求隊列中通過Tag標簽進行請求的查找 ????????request.setTag("testGet"); ????????//將請求加入全局隊列中 ????????MyApplication.getHttpQueues().add(request); ????} ~~~ Get方式請求數據返回JsonObjectRequest對象 ~~~ /** ?*??new?JsonObjectRequest(int?method,String?url,JsonObject?jsonObject,Listener?listener,ErrorListener?errorListener) ?*??method:請求方式,Get請求為Method.GET,Post請求為Method.POST ?*??url:請求地址 ?*??JsonObject:Json格式的請求參數。如果使用的是Get請求方式,請求參數已經包含在url中,所以可以將此參數置為null ?*??listener:請求成功后的回調 ?*??errorListener:請求失敗的回調 ?*/ private?void?volleyGet()?{ ????String?url?=?"http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=json&ip=218.4.255.255"; ????JsonObjectRequest?request?=?new?JsonObjectRequest(Method.GET,?url,?null, ????????????new?Listener<JSONObject>()?{ ????????????????@Override ????????????????public?void?onResponse(JSONObject?jsonObject)?{//jsonObject為請求返回的Json格式數據 ????????????????????Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_LONG).show(); ????????????????} ????????????}, ????????????new?ErrorListener()?{ ????????????????@Override ????????????????public?void?onErrorResponse(VolleyError?volleyError)?{ ????????????????????Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show(); ????????????????} ????????????}); ????//設置請求的Tag標簽,可以在全局請求隊列中通過Tag標簽進行請求的查找 ????request.setTag("testGet"); ????//將請求加入全局隊列中 ????MyApplication.getHttpQueues().add(request); ~~~ Post方式請求數據返回StringRequest對象 ~~~ /** ?????*?使用Post方式返回String類型的請求結果數據 ?????*? ?????*??new?StringRequest(int?method,String?url,Listener?listener,ErrorListener?errorListener) ?????*??method:請求方式,Get請求為Method.GET,Post請求為Method.POST ?????*??url:請求地址 ?????*??listener:請求成功后的回調 ?????*??errorListener:請求失敗的回調 ?????*/ ????private?void?volleyPost()?{ ????????String?url?=?"https://tcc.taobao.com/cc/json/mobile_tel_segment.htm"; ????????StringRequest?request?=?new?StringRequest(Method.POST,?url, ????????????????new?Listener<String>()?{ ????????????????????@Override ????????????????????public?void?onResponse(String?s)?{//s為請求返回的字符串數據 ????????????????????????Toast.makeText(MainActivity.this,s,Toast.LENGTH_LONG).show(); ????????????????????} ????????????????}, ????????????????new?ErrorListener()?{ ????????????????????@Override ????????????????????public?void?onErrorResponse(VolleyError?volleyError)?{ ????????????????????????Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show(); ????????????????????} ????????????????}){ ????????????????????@Override ????????????????????protected?Map<String,?String>?getParams()?throws?AuthFailureError?{ ????????????????????????Map<String,String>?map?=?new?HashMap<>(); ????????????????????????//將請求參數名與參數值放入map中 ????????????????????????map.put("tel","15850781443"); ????????????????????????return?map; ????????????????????} ????????????????} ????????????????; ????????//設置請求的Tag標簽,可以在全局請求隊列中通過Tag標簽進行請求的查找 ????????request.setTag("testPost"); ????????//將請求加入全局隊列中 ????????MyApplication.getHttpQueues().add(request); ????} ~~~ Post方式請求數據返回JsonObject對象 ~~~ /** ?*??使用Post方式返回JsonObject類型的請求結果數據 ?* ?*??new?JsonObjectRequest(int?method,String?url,JsonObject?jsonObject,Listener?listener,ErrorListener?errorListener) ?*??method:請求方式,Get請求為Method.GET,Post請求為Method.POST ?*??url:請求地址 ?*??JsonObject:Json格式的請求參數。如果使用的是Get請求方式,請求參數已經包含在url中,所以可以將此參數置為null ?*??listener:請求成功后的回調 ?*??errorListener:請求失敗的回調 ?*/ private?void?volleyPost()?{ ????String?url?=?"http://www.kuaidi100.com/query"; ????Map<String,String>?map?=?new?HashMap<>(); ????map.put("type","yuantong"); ????map.put("postid","229728279823"); ????//將map轉化為JSONObject對象 ????JSONObject?jsonObject?=?new?JSONObject(map); ????JsonObjectRequest?request?=?new?JsonObjectRequest(Method.POST,?url,?jsonObject, ????????????new?Listener<JSONObject>()?{ ????????????????@Override ????????????????public?void?onResponse(JSONObject?jsonObject)?{//jsonObject為請求返回的Json格式數據 ????????????????????Toast.makeText(MainActivity.this,jsonObject.toString(),Toast.LENGTH_LONG).show(); ????????????????} ????????????}, ????????????new?ErrorListener()?{ ????????????????@Override ????????????????public?void?onErrorResponse(VolleyError?volleyError)?{ ????????????????????Toast.makeText(MainActivity.this,volleyError.toString(),Toast.LENGTH_LONG).show(); ????????????????} ????????????}); ????//設置請求的Tag標簽,可以在全局請求隊列中通過Tag標簽進行請求的查找 ????request.setTag("testPost"); ????//將請求加入全局隊列中 ????MyApplication.getHttpQueues().add(request); } ~~~ Activity生命周期聯動 ~~~ @Override protected?void?onStop()?{ ????super.onStop(); ????//通過Tag標簽取消請求隊列中對應的全部請求 ????MyApplication.getHttpQueues().cancelAll("abcGet"); } ~~~ 使用ImageRequest加載網絡圖片 ~~~ /** ?????*??通過Volley加載網絡圖片 ?????* ?????*??new?ImageRequest(String?url,Listener?listener,int?maxWidth,int?maxHeight,Config?decodeConfig,ErrorListener?errorListener) ?????*??url:請求地址 ?????*??listener:請求成功后的回調 ?????*??maxWidth、maxHeight:設置圖片的最大寬高,如果均設為0則表示按原尺寸顯示 ?????*??decodeConfig:圖片像素的儲存方式。Config.RGB_565表示每個像素占2個字節,Config.ARGB_8888表示每個像素占4個字節等。 ?????*??errorListener:請求失敗的回調 ?????*/ ????private?void?loadImageByVolley()?{ ????????String?url?=?"http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg"; ????????ImageRequest?request?=?new?ImageRequest( ????????????????????????????url, ????????????????????????????new?Listener<Bitmap>()?{ ????????????????????????????????@Override ????????????????????????????????public?void?onResponse(Bitmap?bitmap)?{ ????????????????????????????????????image.setImageBitmap(bitmap); ????????????????????????????????} ????????????????????????????}, ????????????????????????????0,?0,?Config.RGB_565, ????????????????????????????new?ErrorListener()?{ ????????????????????????????????@Override ????????????????????????????????public?void?onErrorResponse(VolleyError?volleyError)?{ ????????????????????????????????????image.setImageResource(R.mipmap.ic_launcher); ????????????????????????????????} ????????????????????????????}); ????????//設置請求的Tag標簽,可以在全局請求隊列中通過Tag標簽進行請求的查找 ????????request.setTag("loadImage"); ????????//通過Tag標簽取消請求隊列中對應的全部請求 ????????MyApplication.getHttpQueues().add(request); ????} ~~~ ImageLoader加載及緩存網絡圖片 ~~~ /** ?????*??通過ImageLoader加載及緩存網絡圖片    * ?????*??new?ImageLoader(RequestQueue?queue,ImageCache?imageCache) ?????*??queue:請求隊列 ?????*??imageCache:一個用于圖片緩存的接口,一般需要傳入它的實現類 ?????* ?????*??getImageListener(ImageView?view,?int?defaultImageResId,?int?errorImageResId) ?????*??view:ImageView對象 ?????*??defaultImageResId:默認的圖片的資源Id ?????*??errorImageResId:網絡圖片加載失敗時顯示的圖片的資源Id ?????*/ ????private?void?loadImageWithCache()?{ ????????String?url?=?"http://pic20.nipic.com/20120409/9188247_091601398179_2.jpg"; ????????ImageLoader?loader?=?new?ImageLoader(MyApplication.getHttpQueues(),?new?BitmapCache()); ????????ImageListener?listener?=?loader.getImageListener(image,R.mipmap.ic_launcher,R.mipmap.ic_launcher); ????????//加載及緩存網絡圖片 ????????loader.get(url,listener); ????} ~~~ BitmapCache?設置圖片緩存 ~~~ public?class?BitmapCache?implements?ImageLoader.ImageCache{ ????//LruCache是基于內存的緩存類 ????private?LruCache<String,Bitmap>?lruCache; ????//LruCache的最大緩存大小 ????private?int?max?=?10?*?1024?*?1024; ????public?BitmapCache()?{ ????????lruCache?=?new?LruCache<String,?Bitmap>(max){ ????????????@Override ????????????//緩存圖片的大小 ????????????protected?int?sizeOf(String?key,?Bitmap?value)?{ ????????????????return?value.getRowBytes()?*?value.getHeight(); ????????????} ????????}; ????} ????@Override ????public?Bitmap?getBitmap(String?s)?{ ????????return?lruCache.get(s); ????} ????@Override ????public?void?putBitmap(String?s,?Bitmap?bitmap)?{ ????????lruCache.put(s,bitmap); ????} } ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看