频道栏目
首页 > 程序开发 > 移动开发 > 其他 > 正文
比较全的 OkHttp封装类+网络拦截器
2017-12-07 01:51:42      个评论    来源:IT666DHW的博客  
收藏   我要投稿

比较全的 OkHttp封装类+网络拦截器。

  1. 首先我们先写一个拦截器
  2. importandroid.os.Build;
  3. importandroid.util.Log;
  4.  
  5. importcom.google.gson.Gson;
  6.  
  7. importjava.io.IOException;
  8. importjava.util.logging.Logger;
  9.  
  10. importokhttp3.Interceptor;
  11. importokhttp3.Request;
  12. importokhttp3.Response;
  13.  
  14. /**
  15. *网络拦截器
  16. */
  17.  
  18. publicclassLoggingInterceptorimplementsInterceptor{
  19. privatestaticfinalStringUA="User-Agent";
  20.  
  21. @Override
  22. publicResponseintercept(Chainchain)throwsIOException{
  23. Requestrequest=chain.request()
  24. .newBuilder()
  25. .addHeader(UA,makeUA())
  26. .build();
  27. returnchain.proceed(request);
  28. }
  29.  
  30. privateStringmakeUA(){
  31. Strings=Build.BRAND+"/"+Build.MODEL+"/"+Build.VERSION.RELEASE;
  32. returnBuild.BRAND+"/"+Build.MODEL+"/"+Build.VERSION.RELEASE;
  33. }
  34.  
  35. }

     

     

    然后我们在OkHttp中加入添加我们的拦截器

     

     

    1.  
    2. importandroid.os.Handler;
    3. importandroid.os.Looper;
    4. importjava.io.File;
    5. importjava.io.FileOutputStream;
    6. importjava.io.IOException;
    7. importjava.io.InputStream;
    8. importjava.util.HashMap;
    9. importjava.util.Map;
    10. importjava.util.concurrent.TimeUnit;
    11. importokhttp3.Call;
    12. importokhttp3.Callback;
    13. importokhttp3.FormBody;
    14. importokhttp3.OkHttpClient;
    15. importokhttp3.Request;
    16. importokhttp3.RequestBody;
    17. importokhttp3.Response;
    18.  
    19.  
    20. publicclassOkHttp{
    21.  
    22. /**
    23. *静态实例
    24. */
    25. privatestaticOkHttpsOkHttpManager;
    26.  
    27. /**
    28. *okhttpclient实例
    29. */
    30. privateOkHttpClientmClient;
    31.  
    32. /**
    33. *因为我们请求数据一般都是子线程中请求,在这里我们使用了handler
    34. */
    35. privateHandlermHandler;
    36.  
    37. /**
    38. *构造方法
    39. */
    40. privateOkHttp(){
    41.  
    42. mClient=newOkHttpClient.Builder()
    43. //添加拦截器
    44. .addInterceptor(newLoggingInterceptor())
    45. .build();
    46.  
    47. /**
    48. *在这里直接设置连接超时.读取超时,写入超时
    49. */
    50. mClient.newBuilder().connectTimeout(10,TimeUnit.SECONDS);
    51. mClient.newBuilder().readTimeout(10,TimeUnit.SECONDS);
    52. mClient.newBuilder().writeTimeout(10,TimeUnit.SECONDS);
    53. /**
    54. *初始化handler
    55. */
    56. mHandler=newHandler(Looper.getMainLooper());
    57. }
    58.  
    59.  
    60. /**
    61. *单例模式获取OkHttp实例
    62. *
    63. *@return
    64. */
    65. publicstaticOkHttpgetInstance(){
    66.  
    67. if(sOkHttpManager==null){
    68. sOkHttpManager=newOkHttp();
    69. }
    70. returnsOkHttpManager;
    71. }
    72.  
    73. //-------------------------同步的方式请求数据--------------------------
    74.  
    75. /**
    76. *对外提供的get方法,同步的方式
    77. *
    78. *@paramurl传入的地址
    79. *@return
    80. */
    81. publicstaticResponsegetSync(Stringurl){
    82.  
    83. //通过获取到的实例来调用内部方法
    84. returnsOkHttpManager.inner_getSync(url);
    85. }
    86.  
    87. /**
    88. *GET方式请求的内部逻辑处理方式,同步的方式
    89. *
    90. *@paramurl
    91. *@return
    92. */
    93. privateResponseinner_getSync(Stringurl){
    94. Requestrequest=newRequest.Builder().url(url).build();
    95. Responseresponse=null;
    96. try{
    97. //同步请求返回的是response对象
    98. response=mClient.newCall(request).execute();
    99. }catch(IOExceptione){
    100. e.printStackTrace();
    101. }
    102. returnresponse;
    103. }
    104.  
    105. /**
    106. *对外提供的同步获取String的方法
    107. *
    108. *@paramurl
    109. *@return
    110. */
    111. publicstaticStringgetSyncString(Stringurl){
    112. returnsOkHttpManager.inner_getSyncString(url);
    113. }
    114.  
    115.  
    116. /**
    117. *同步方法
    118. */
    119. privateStringinner_getSyncString(Stringurl){
    120. Stringresult=null;
    121. try{
    122. /**
    123. *把取得到的结果转为字符串,这里最好用string()
    124. */
    125. result=inner_getSync(url).body().string();
    126. }catch(IOExceptione){
    127. e.printStackTrace();
    128. }
    129. returnresult;
    130. }
    131.  
    132. //-------------------------异步的方式请求数据--------------------------
    133. publicstaticvoidgetAsync(Stringurl,DataCallBackcallBack){
    134. getInstance().inner_getAsync(url,callBack);
    135. }
    136.  
    137. /**
    138. *内部逻辑请求的方法
    139. *
    140. *@paramurl
    141. *@paramcallBack
    142. *@return
    143. */
    144. privatevoidinner_getAsync(Stringurl,finalDataCallBackcallBack){
    145. finalRequestrequest=newRequest.Builder().url(url).build();
    146.  
    147. mClient.newCall(request).enqueue(newCallback(){
    148. @Override
    149. publicvoidonFailure(Callcall,IOExceptione){
    150. deliverDataFailure(request,e,callBack);
    151. }
    152.  
    153. @Override
    154. publicvoidonResponse(Callcall,Responseresponse)throwsIOException{
    155. Stringresult=null;
    156. try{
    157. result=response.body().string();
    158. }catch(IOExceptione){
    159. deliverDataFailure(request,e,callBack);
    160. }
    161. deliverDataSuccess(result,callBack);
    162. }
    163. });
    164. }
    165.  
    166.  
    167. /**
    168. *分发失败的时候调用
    169. *
    170. *@paramrequest
    171. *@parame
    172. *@paramcallBack
    173. */
    174. privatevoiddeliverDataFailure(finalRequestrequest,finalIOExceptione,finalDataCallBackcallBack){
    175. /**
    176. *在这里使用异步处理
    177. */
    178. mHandler.post(newRunnable(){
    179. @Override
    180. publicvoidrun(){
    181. if(callBack!=null){
    182. callBack.requestFailure(request,e);
    183. }
    184. }
    185. });
    186. }
    187.  
    188. /**
    189. *分发成功的时候调用
    190. *
    191. *@paramresult
    192. *@paramcallBack
    193. */
    194. privatevoiddeliverDataSuccess(finalStringresult,finalDataCallBackcallBack){
    195. /**
    196. *在这里使用异步线程处理
    197. */
    198. mHandler.post(newRunnable(){
    199. @Override
    200. publicvoidrun(){
    201. if(callBack!=null){
    202. try{
    203. callBack.requestSuccess(result);
    204. }catch(Exceptione){
    205. e.printStackTrace();
    206. }
    207. }
    208. }
    209. });
    210. }
    211.  
    212. /**
    213. *数据回调接口
    214. */
    215. publicinterfaceDataCallBack{
    216. voidrequestFailure(Requestrequest,IOExceptione);
    217.  
    218. voidrequestSuccess(Stringresult)throwsException;
    219. }
    220.  
    221. //-------------------------提交表单--------------------------
    222.  
    223. publicstaticvoidpostAsync(Stringurl,Mapparams,DataCallBackcallBack){
    224. getInstance().inner_postAsync(url,params,callBack);
    225. }
    226.  
    227. privatevoidinner_postAsync(Stringurl,Mapparams,finalDataCallBackcallBack){
    228.  
    229. RequestBodyrequestBody=null;
    230. if(params==null){
    231. params=newHashMap<>();
    232. }
    233.  
    234. /**
    235. *如果是3.0之前版本的,构建表单数据是下面的一句
    236. */
    237. //FormEncodingBuilderbuilder=newFormEncodingBuilder();
    238.  
    239. /**
    240. *3.0之后版本
    241. */
    242. FormBody.Builderbuilder=newFormBody.Builder();
    243.  
    244. /**
    245. *在这对添加的参数进行遍历,map遍历有四种方式,如果想要了解的可以网上查找
    246. */
    247. for(Map.Entrymap:params.entrySet()){
    248. Stringkey=map.getKey().toString();
    249. Stringvalue=null;
    250. /**
    251. *判断值是否是空的
    252. */
    253. if(map.getValue()==null){
    254. value="";
    255. }else{
    256. value=map.getValue();
    257. }
    258. /**
    259. *把key和value添加到formbody中
    260. */
    261. builder.add(key,value);
    262. }
    263. requestBody=builder.build();
    264. //结果返回
    265. //请求对象
    266. finalRequestrequest=newRequest.Builder().url(url).post(requestBody).build();
    267. mClient.newCall(request).enqueue(newCallback(){
    268. @Override
    269. publicvoidonFailure(Callcall,IOExceptione){
    270. deliverDataFailure(request,e,callBack);
    271. }
    272.  
    273. @Override
    274. publicvoidonResponse(Callcall,Responseresponse)throwsIOException{
    275. Stringresult=response.body().string();
    276. deliverDataSuccess(result,callBack);
    277. }
    278.  
    279.  
    280. });
    281. }
    282.  
    283.  
    284. //-------------------------文件下载--------------------------
    285. publicstaticvoiddownloadAsync(Stringurl,StringdesDir,DataCallBackcallBack){
    286. getInstance().inner_downloadAsync(url,desDir,callBack);
    287. }
    288.  
    289. /**
    290. *下载文件的内部逻辑处理类
    291. *
    292. *@paramurl下载地址
    293. *@paramdesDir目标地址
    294. *@paramcallBack
    295. */
    296. privatevoidinner_downloadAsync(finalStringurl,finalStringdesDir,finalDataCallBackcallBack){
    297. finalRequestrequest=newRequest.Builder().url(url).build();
    298. mClient.newCall(request).enqueue(newCallback(){
    299. @Override
    300. publicvoidonFailure(Callcall,IOExceptione){
    301. deliverDataFailure(request,e,callBack);
    302. }
    303.  
    304. @Override
    305. publicvoidonResponse(Callcall,Responseresponse)throwsIOException{
    306.  
    307. /**
    308. *在这里进行文件的下载处理
    309. */
    310. InputStreaminputStream=null;
    311. FileOutputStreamfileOutputStream=null;
    312. try{
    313. //文件名和目标地址
    314. Filefile=newFile(desDir,getFileName(url));
    315. //把请求回来的response对象装换为字节流
    316. inputStream=response.body().byteStream();
    317. fileOutputStream=newFileOutputStream(file);
    318. intlen=0;
    319. byte[]bytes=newbyte[2048];
    320. //循环读取数据
    321. while((len=inputStream.read(bytes))!=-1){
    322. fileOutputStream.write(bytes,0,len);
    323. }
    324. //关闭文件输出流
    325. fileOutputStream.flush();
    326. //调用分发数据成功的方法
    327. deliverDataSuccess(file.getAbsolutePath(),callBack);
    328. }catch(IOExceptione){
    329. //如果失败,调用此方法
    330. deliverDataFailure(request,e,callBack);
    331. e.printStackTrace();
    332. }finally{
    333. if(inputStream!=null){
    334. inputStream.close();
    335. }
    336. if(fileOutputStream!=null){
    337. fileOutputStream.close();
    338. }
    339.  
    340. }
    341. }
    342.  
    343. });
    344. }
    345.  
    346. /**
    347. *根据文件url获取文件的路径名字
    348. *
    349. *@paramurl
    350. *@return
    351. */
    352. privateStringgetFileName(Stringurl){
    353. intseparatorIndex=url.lastIndexOf("/");
    354. Stringpath=(separatorIndex<0)?url:url.substring(separatorIndex+1,url.length());
    355. returnpath;
    356. }
    357.  
    358.  
    359. }

    不要忘记导入OkHttp的依赖

     

点击复制链接 与好友分享!回本站首页
上一篇:gpio在输入模式下一直为低电平解决方法
下一篇:MSM8937-MSM8953 I2C 配置调试指南
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站