亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Android > 正文

Android中volley封裝實踐記錄(二)

2019-10-21 21:25:44
字體:
供稿:網(wǎng)友

前言

關(guān)于android的volley封裝之前寫過一篇文章,見鏈接(http://www.49028c.com/kaifa/android/345045.html)。這篇文章主要是換種方式進(jìn)行封裝,具體步驟如下所示。

步驟如下

1.創(chuàng)建Request,并設(shè)置相應(yīng)的參數(shù):

public class CommonJsonObjectRequest extends JsonObjectRequest { private String TAG = this.getClass().getSimpleName(); /* * code=1:處理成功; */ public static final int CODE_SUCCESS = 100; private Context mContext; private JSONObject mJsonRequest; public CommonJsonObjectRequest(Context context, int method, String url,     JSONObject jsonRequest, Response.Listener<JSONObject> listener,     Response.ErrorListener errorListener) { super(method, url, jsonRequest, listener, errorListener); init(context, jsonRequest); } /** * @param context * @param url * @param jsonRequest * @param listener * @param errorListener */ public CommonJsonObjectRequest(Context context, String url, JSONObject jsonRequest,     Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) { super(url, jsonRequest, listener, errorListener); if (jsonRequest != null) {  Log.d(TAG, jsonRequest.toString()); } init(context, jsonRequest); } /** * @param context * @param jsonRequest */ private void init(Context context, JSONObject jsonRequest) { this.mContext = context.getApplicationContext(); this.mJsonRequest = jsonRequest; setRetryPolicy(new DefaultRetryPolicy(10 * 1000, 0, 0)); } @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> headersMap = new HashMap<>(); //do your business requirement return headersMap; }}

所做的工作也很簡單,去配置網(wǎng)絡(luò)訪問RetryPolicy,比如超時時間,最大的重試次數(shù)。例外也會根據(jù)業(yè)務(wù)要求在請求的頭部加入token等標(biāo)識。

2.通過工廠模式創(chuàng)建請求隊列,volley內(nèi)部會有兩種構(gòu)造方式,同步請求或者異步請求,通過設(shè)置ResponseDelivery 可以實現(xiàn)。

public interface ResponseDelivery { /** * Parses a response from the network or cache and delivers it. */ public void postResponse(Request<?> request, Response<?> response); /** * Parses a response from the network or cache and delivers it. The provided * Runnable will be executed after delivery. */ public void postResponse(Request<?> request, Response<?> response, Runnable runnable); /** * Posts an error for the given request. */ public void postError(Request<?> request, VolleyError error);}

這個工廠的代碼如下:

/** * 網(wǎng)絡(luò)請求隊列工廠類 */public class RequestQueueFactory { private static RequestQueue sRequestQueue; private static RequestQueue sAsynRequestQueue; private static int ASYN_QUEUE_THREAD_POOL_SIZE = 3; private RequestQueueFactory() { } /** * 獲取默認(rèn)RequestQueue,回調(diào)是同步到主線程的 * * @param context * @return */ public synchronized static RequestQueue getRequestQueue(Context context) { if (sRequestQueue == null) {  OkHttpClient okHttpClient = new OkHttpClient.Builder().build();  OkHttpStack stack = new OkHttpStack(okHttpClient);  sRequestQueue = Volley.newRequestQueue(context, stack); } return sRequestQueue; } /** * 獲取異步RequestQueue,回調(diào)是在異步線程的 * * @param context * @return */ public synchronized static RequestQueue getAsynRequeQueueRespond(  final Context context) { if (sAsynRequestQueue == null) {  sAsynRequestQueue = getAsynRequeQueueRespond(context,   ASYN_QUEUE_THREAD_POOL_SIZE); } return sAsynRequestQueue; } private static RequestQueue getAsynRequeQueueRespond(final Context context,        int threadPoolSize) { File cacheDir = new File(context.getCacheDir(), "volley_asyn"); OkHttpClient okHttpClient = new OkHttpClient.Builder().build(); OkHttpStack stack = new OkHttpStack(okHttpClient); Network network = new BasicNetwork(stack); RequestQueue queue = new RequestQueue(new DiskBasedCache(cacheDir),  network, threadPoolSize, new ExecutorDelivery(  AsyncTask.SERIAL_EXECUTOR)); queue.start(); return queue; }}

在代碼中有這樣兩行代碼:

 if (sRequestQueue == null) {  OkHttpClient okHttpClient = new OkHttpClient.Builder().build();  OkHttpStack stack = new OkHttpStack(okHttpClient);  sRequestQueue = Volley.newRequestQueue(context, stack); }

這里是使用了okhttpstack,如果不進(jìn)行設(shè)置,內(nèi)部默認(rèn)的會設(shè)置一個stack;

 if (stack == null) {  if (Build.VERSION.SDK_INT >= 9) {  stack = new HurlStack();  } else {  // Prior to Gingerbread, HttpUrlConnection was unreliable.  // See: http://android-developers.blogspot.com/2011/09/androids-http-clients.html  stack = new HttpClientStack(AndroidHttpClient.newInstance(userAgent));  } }

okhttpstack類如下:

/** * 使用OKHttp作為底層的HttpStack */public class OkHttpStack implements HttpStack { private final OkHttpClient client; public OkHttpStack(OkHttpClient client) { this.client = client; } private static HttpEntity entityFromOkHttpResponse(Response response) throws IOException { BasicHttpEntity entity = new BasicHttpEntity(); ResponseBody body = response.body(); entity.setContent(body.byteStream()); entity.setContentLength(body.contentLength()); entity.setContentEncoding(response.header("Content-Encoding")); if (body.contentType() != null) {  entity.setContentType(body.contentType().type()); } return entity; } @SuppressWarnings("deprecation") private static void setConnectionParametersForRequest  (okhttp3.Request.Builder builder, Request<?> request)  throws IOException, AuthFailureError { switch (request.getMethod()) {  case Request.Method.DEPRECATED_GET_OR_POST:  byte[] postBody = request.getPostBody();  if (postBody != null) {   builder.post(RequestBody.create    (MediaType.parse(request.getPostBodyContentType()), postBody));  }  break;  case Request.Method.GET:  builder.get();  break;  case Request.Method.DELETE:  builder.delete();  break;  case Request.Method.POST:  builder.post(createRequestBody(request));  break;  case Request.Method.PUT:  builder.put(createRequestBody(request));  break;  case Request.Method.HEAD:  builder.head();  break;  case Request.Method.OPTIONS:  builder.method("OPTIONS", null);  break;  case Request.Method.TRACE:  builder.method("TRACE", null);  break;  case Request.Method.PATCH:  builder.patch(createRequestBody(request));  break;  default:  throw new IllegalStateException("Unknown method type."); } } private static RequestBody createRequestBody(Request request) throws AuthFailureError { final byte[] body = request.getBody(); if (body == null) return null; return RequestBody.create(MediaType.parse(request.getBodyContentType()), body); } private static ProtocolVersion parseProtocol(final Protocol protocol) { switch (protocol) {  case HTTP_1_0:  return new ProtocolVersion("HTTP", 1, 0);  case HTTP_1_1:  return new ProtocolVersion("HTTP", 1, 1);  case SPDY_3:  return new ProtocolVersion("SPDY", 3, 1);  case HTTP_2:  return new ProtocolVersion("HTTP", 2, 0); } throw new IllegalAccessError("Unkwown protocol"); } @Override public HttpResponse performRequest(Request<?> request, Map<String, String> additionalHeaders)  throws IOException, AuthFailureError { int timeoutMs = request.getTimeoutMs(); OkHttpClient client = this.client.newBuilder()  .readTimeout(timeoutMs, TimeUnit.MILLISECONDS)  .connectTimeout(timeoutMs, TimeUnit.MILLISECONDS)  .writeTimeout(timeoutMs, TimeUnit.MILLISECONDS)  .build(); okhttp3.Request.Builder okHttpRequestBuilder = new okhttp3.Request.Builder(); Map<String, String> headers = request.getHeaders(); for (Map.Entry<String,String> entry : headers.entrySet()) {  okHttpRequestBuilder.addHeader(entry.getKey(), entry.getValue()); } for (Map.Entry<String,String> entry : additionalHeaders.entrySet()) {  okHttpRequestBuilder.addHeader(entry.getKey(), entry.getValue()); }// for (final String name : headers.keySet()) { //entrySet的遍歷效率比keySet高上一個遍歷元素的速度//  okHttpRequestBuilder.addHeader(name, headers.get(name));// }// for (final String name : additionalHeaders.keySet()) {//  okHttpRequestBuilder.addHeader(name, additionalHeaders.get(name));// } setConnectionParametersForRequest(okHttpRequestBuilder, request); okhttp3.Request okhttp3Request = okHttpRequestBuilder.url(request.getUrl()).build(); Response okHttpResponse = client.newCall(okhttp3Request).execute(); StatusLine responseStatus = new BasicStatusLine  (   parseProtocol(okHttpResponse.protocol()),   okHttpResponse.code(),   okHttpResponse.message()  ); BasicHttpResponse response = new BasicHttpResponse(responseStatus); response.setEntity(entityFromOkHttpResponse(okHttpResponse)); Headers responseHeaders = okHttpResponse.headers(); for (int i = 0, len = responseHeaders.size(); i < len; i++) {  final String name = responseHeaders.name(i), value = responseHeaders.value(i);  if (name != null) {  response.addHeader(new BasicHeader(name, value));  } } return response; }}

其中核心代碼在performRequest方法中。

3.封裝基類?;愂褂胊bstract會更靈活,子類可以選擇性的重寫方法。

/** * 網(wǎng)絡(luò)處理基類 */public abstract class BaseNetModel { protected RequestQueue requestQueue; protected Context context; protected Object mTag; protected BaseNetModel(Context context) { this.context = context.getApplicationContext(); requestQueue = RequestQueueFactory.getAsynRequeQueueRespond(this.context); } protected BaseNetModel(Context context, boolean isAsyn) { this.context = context.getApplicationContext(); requestQueue = isAsyn ? RequestQueueFactory.getAsynRequeQueueRespond(this.context)  : RequestQueueFactory.getRequestQueue(context); } /** * 推薦用頁面ClassName+時間戳 * * @param tag */ public void setTag(Object tag) { this.mTag = tag; } public void destroy() { if (mTag != null) {  cancelTaskByTag(mTag); } requestQueue = null; context = null; } public void cancelTaskByTag(Object tag) { if (requestQueue != null) {  requestQueue.cancelAll(tag); } } public void addRequest(String path, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) { addRequest(path, true, jsonRequest, listener, errorListener); } /** * @param path  不帶域名的接口路徑 * @param withTag 是否帶上頁面的tag * @param jsonRequest * @param listener * @param errorListener */ public void addRequest(String path, boolean withTag, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) { addRequestUrl(path, withTag, jsonRequest, listener, errorListener); } /** * @param url  完整接口地址 * @param withTag * @param jsonRequest * @param listener * @param errorListener */ public void addRequestUrl(String url, boolean withTag, JSONObject jsonRequest, Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) { if (jsonRequest == null) {  jsonRequest = new JSONObject(); } CommonJsonObjectRequest request = new CommonJsonObjectRequest(context, url, jsonRequest, listener, errorListener); if (withTag && mTag != null) {  request.setTag(mTag); } requestQueue.add(request); }}

4.邏輯封裝。

這里選用的是一個新聞的接口,這種接口可以在聚合數(shù)據(jù)上申請,有的收費,有的免費。

public class NewsModel extends BaseNetModel { public NewsModel(Context context) { super(context); } public NewsModel(Context context, boolean isAsyn) { super(context, isAsyn); } public void getInfo(Response.Listener<JSONObject> listener, Response.ErrorListener errorListener) throws Exception { JSONObject jsonObject = new JSONObject(); addRequest(INetConstant.NEWS, jsonObject, listener, errorListener); }}

接口的地址為:(http://v.juhe.cn/toutiao/index?type=&key=b2f8e4aeacfa310cabfadd5189bbe4d5)

5.開始使用。

 NewsModel newsModel = new NewsModel(getActivity()); try {  newsModel.getInfo(new Response.Listener<JSONObject>() {  @Override  public void onResponse(final JSONObject response) {   ThreadUtils.runInUIThread(new Runnable() {   @Override   public void run() {    News news = new Gson().fromJson(response.toString(), News.class);    mAdapter.setData(news.getResult().getData());   }   });  }  }, new Response.ErrorListener() {  @Override  public void onErrorResponse(VolleyError error) {  }  }); } catch (Exception e) {  e.printStackTrace(); }

最后放一張圖:

Android,volley,封裝

圖片發(fā)自簡書App

分享結(jié)束,代碼在[github] (https://github.com/daydaydate/sample )  。感謝您的閱讀。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關(guān)教程知識閱讀請移步到Android開發(fā)頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
乱人伦视频在线| 91资源在线视频| 精品一级少妇久久久久久久| 亚洲免费电影在线| 免费观看日韩av| 高清视频一区二区三区四区| 日韩精品成人一区二区三区| 福利在线小视频| 亚洲大胆人体大胆做受1| 欧美日韩综合不卡| 欧美制服丝袜第一页| 国产+高潮+白浆+无码| 久久久久久久久久久久久久久久久久久久| 色综合久久中文字幕综合网小说| 中文字幕亚洲欧美日韩在线不卡| 在线观看网站黄| 精品国产91亚洲一区二区三区www| 国产精品亚洲第一| 亚洲欧美日韩中文字幕在线观看| 天天射夜夜骑| 热re91久久精品国99热蜜臀| 日韩午夜三级在线| 玩弄japan白嫩少妇hd| 成年片费网站色大全免费视频| 99999精品视频| 亚洲精品一区二区三区四区| 国产香蕉一区二区三区在线视频| 欧美猛男性生活免费| 成人精品福利视频| 农村黄色一级片| 一区二区三区四区视频在线| 精品免费视频.| 亚洲成人黄色在线观看| 亚洲精品成人免费| 青青草原国产在线观看| 中文字幕乱码人妻二区三区| 欧美色婷婷天堂网站| 色视频一区二区三区| 伊人久久久久久久久久久久久| 欧美丰满少妇xxxxx做受| 女人18毛片水真多18精品| 欧美电影《睫毛膏》| 国产亚洲精品久久久久久久| 最近更新的2019中文字幕| 日韩精品一页| 3d动漫精品啪啪一区二区三区免费| 免费在线不卡视频| 免费黄色网页| 国产美女在线播放| 少妇无码一区二区三区| 国产不卡精品视频| 日韩中文字幕一区二区| 美女主播视频一区| 久久艹中文字幕| 日av在线播放中文不卡| 欧美日韩亚洲国产综合| 在线亚洲午夜片av大片| 免费看污网站| av在线不卡免费观看| 成人三级视频在线播放| 亚洲黄色av片| 国产日韩欧美黄色| 国产精品国色综合久久| а√天堂中文在线资源bt在线| 亚洲欧洲激情在线| 欧洲精品亚洲精品| 美女搞黄视频在线观看| 中文字幕巨乱亚洲| 一本久道高清无码视频| 国产精品无码一区二区三| 中文字幕一区不卡| 3d玉蒲团在线观看| 91香蕉国产在线观看软件| 亚洲精品视频一二三| 中文字幕无码乱码人妻日韩精品| 国际精品欧美精品| 性xxxx欧美老肥妇牲乱| 成人毛片一区二区三区| 5566中文字幕| 精品国产一区二区三区久久影院| 亚洲三级在线视频| 欧亚成年男女午夜| 少妇精品放荡导航| 爽爽淫人综合网网站| 久久精品亚洲| 日韩欧美国产一区二区在线播放| 天堂中文字幕在线| 欧美日韩美女在线| 欧美日韩福利在线观看| jizz欧美激情18| fc2成人免费人成在线观看播放| 国产久草在线| 久久久电影一区二区三区| 久久精品噜噜噜成人av农村| 成人午夜电影免费在线观看| 一本一道dvd在线观看免费视频| 一个人看的日本免费视频| 免费看毛片的网址| 最新在线地址| 日日噜噜噜噜夜夜爽亚洲精品| 先锋av在线资源| 国产精品成人一区二区三区| 色先锋av资源| 成年人深夜福利| 精品日韩欧美一区| 成人涩涩视频| 国产色一区二区三区| 成人av免费电影| 国产视频一区二区三区在线播放| 国产区亚洲区欧美区| 一区二区亚洲欧洲国产日韩| 日韩精品在线免费观看视频| 国产综合在线观看视频| 不卡的av电影在线观看| 亚洲精品中文字幕乱码三区不卡| 国产一区二区免费电影| 久久www视频| 国产精品乱看| 欧美sss在线视频| 亚洲同志男男gay1069网站| 国产精品久久久高清免费| 秋霞蜜臀av久久电影网免费| 99re这里只有精品6| 超在线视频97| 日韩男人天堂| 国内精品久久久久久中文字幕| 亚洲一区二区蜜桃| 久久久一本精品99久久精品66| 国产激情偷乱视频一区二区三区| 国产校园另类小说区| 国产精品av久久久久久麻豆网| 久久久久久国产精品三级玉女聊斋| 成人在线视频你懂的| 精品国产影院| 中文视频在线| 久久久久久久久99| 无码av中文一区二区三区桃花岛| 国产欧美在线| 欧洲精品一区二区三区久久| 亚洲区中文字幕| 精品素人av| 毛片在线视频播放| 鲁一鲁一鲁一鲁一av| 久久99精品久久久久久久久久| 狠狠色综合色区| 麻豆91在线观看| 在线看片国产福利你懂的| 亚洲人高潮女人毛茸茸| √…a在线天堂一区| 中文字幕精品一区二区精| 亚洲视频导航| 乱老熟女一区二区三区| www.av精品| 久久精品久久久久电影| 色一情一乱一区二区三区| 视频一区视频二区中文| 精品视频一二三区| 成人永久免费视频| 在线一区二区视频| 国产专区精品视频| 日产精品久久久| 久久91超碰青草是什么| www.午夜精品| 亚洲人成精品久久久| 三级无遮挡在线观看| 亚洲精品蜜桃乱晃| 欧美一区二区三区在线看| 色婷婷精品大视频在线蜜桃视频| 亚洲成色777777女色窝| 国产一区二区日韩精品欧美精品| 蜜臀av午夜一区二区三区| 91视频91自| 日韩欧美一区二区在线观看| 精品国产视频| 欧美成人黄色网址| 草草久视频在线观看电影资源| a视频在线播放| 免费看av大片| 成人动漫视频在线观看免费| 一级黄色大片免费| 制服丝袜日韩| 伊人色在线视频| 亚洲图片欧美午夜| 我想看黄色大片| 伊人久久大香线蕉av超碰演员| 中文字幕一区二区三区乱码不卡| 国产亚洲精品bt天堂精选| 亚洲午夜国产成人| 亚洲天堂在线视频观看| 天堂在线中文字幕| av在线综合网| 香蕉成人啪国产精品视频综合网| 香蕉av一区二区三区| 国产在线不卡| 另类av导航| 欧美 丝袜 自拍 制服 另类| 国产一区二区三区四区hd| 日本久久精品| 在线免费亚洲电影| 一区二区三区四区在线播放| 欧美福利一区二区三区| 亚洲日本网址| 欧美一区二区三区粗大| 天天综合天天做天天综合| 高端美女服务在线视频播放| 欧美一区二区三区成人久久片| 97精品伊人久久久大香线蕉| 色哟哟精品观看| 国产精品吊钟奶在线| 国产蜜臀一区二区打屁股调教| 日日嗨av一区二区三区四区| 尤物视频网址| 57pao成人国产永久免费| 日韩免费av一区| 亚洲精品久久7777777| av不卡在线看| 操人视频91| 污网站在线观看免费| 中文字幕一区二区三三| 亚洲免费观看在线观看| 国产成人精品无码片区在线| 亚洲综合成人网| 香蕉视频一区二区三区| 一区二区三区四区蜜桃| 欧美日韩精品免费看| 亚洲在线观看| 亚洲AV无码国产精品午夜字幕| 国产精品久久久久久久久久久久久久久久| 国产经典一区二区| 人九九综合九九宗合| 精品免费视频123区| 欧美自拍偷拍网| 欧美日韩国产bt| 在线观看视频一区二区| 日韩一级免费片| 狠狠v欧美v日韩v亚洲ⅴ| 成年人在线观看| 成人av动漫在线| 国产精品99久久久久久宅男| 韩国三级电影久久久久久| 黄页网站大全一区二区| 久久激情五月激情| eeuss一区二区三区| 国产一级大片| 国产高清欧美| 视频一区欧美日韩| 国产在线视频不卡二| 精品久久毛片| 国产一区二区网站| 一级黄色免费网站| 精品视频在线免费看| 国产娇喘精品一区二区三区图片| 亚洲精品成av人片天堂无码| av中文一区二区三区| 91网页在线观看| 免费99视频| 国产成人福利| 福利片在线播放| 丝袜美腿玉足3d专区一区| 日韩免费电影一区二区| 黑人巨大精品欧美一区二区桃花岛| 18视频在线观看| 678五月天丁香亚洲综合网| 国产视频二区在线观看| 久久天堂av综合合色| 特黄aaaaaaaaa真人毛片| 天天综合网天天| 永久免费未视频| 亚洲天堂视频网| 一区二区三区蜜桃| h片在线免费看| 免费网站观看www在线观看| 撸视在线观看免费视频| 精品入口麻豆88视频| 国产成人亚洲精品乱码在线观看| 91久久奴性调教| 日本黄色电影网站| 一区二区91美女张开腿让人桶| 北条麻妃亚洲一区| 亚洲视频成人| 日韩欧美天堂| 亚洲激情电影在线| 亚洲国产精品99久久| 久久在精品线影院精品国产| 无人视频在线观看免费| caopon在线免费视频| 国产精品视频麻豆| 久久久久国产精品www| 你真棒插曲来救救我在线观看| 欧美精品xx| 欧美www视频在线观看| 国产偷亚洲偷欧美偷精品| 在哪里可以看毛片| 精品无码人妻少妇久久久久久| 亚洲淫性视频| 91tv国产成人福利| 先锋影音av321| 欧美亚洲国产怡红院影院| av成人手机在线| 精品国产99久久久久久| 美女被黑人40厘米进入| 福利视频一区二区三区四区| 国产精品中文字幕久久久| 国产视频一区在线| 国产精品激情自拍| 国产精品卡一卡二卡三| 日韩欧美国产成人一区二区| 一区二区三区日本视频| 亚洲爱情岛论坛永久| 看片网站在线观看| 一区二区精品免费视频| 国产三级伦理在线| 欧美熟妇乱码在线一区| 国产精品美女一区二区在线观看| 中文字幕日日夜夜| 中文字幕中文字幕在线中一区高清| 91九色02白丝porn| 98色花堂精品视频在线观看| 91久色porny| 久久香蕉国产线看观看网| 欧美精品18videos性欧| 黄色日韩网站视频| 欧美丝袜第三区| 欧美丝袜激情| 精品国产一区a| 亚洲高清色综合| 嫩模一区二区三区| 欧美绝顶高潮抽搐喷水合集|