android网络请求框架汇总
网络
使用网络库不要忘记添加网络权限
2.1网络_Volley
· 简介:
Volley的中文翻译为“齐射、并发”,是在2013年的Google大会上发布的一款Android平台网络通信库,具有网络请求的处理、小图片的异步加载和缓存等功能,能够帮助Android APP 更方便地执行网络操作,而且更快速高效。
在Google IO的演讲上,其配图是一幅发射火弓箭的图,有点类似流星。这表示,Volley特别适合数据量不大但是通信频繁的场景。见下图:
https://android.googlesource.com/platform/frameworks/volley/
https://github.com/mcxiaoke/android-volley
网络资料参考:http://www.dengzhr.com/others/mobile/android/762
· 特点:
o 通信更快,更简单
o 支持网络请求的排序,优先级处理
o 支持网络请求的缓存
o 多级别的取消请求
o 扩展性强(可以自己进行相关的封装,比如说请求失败重试机制等)
· 配置依赖:
0. compile'com.mcxiaoke.volley:library:1.0.19'
· 使用步骤:
1. 创建RequestQueue
1. requestQueue= Volley.newRequestQueue(this);
2. 创建Request对象
1. //StringRequest响应的主体为字符串
2. //JsonArrayRequest发送和接收JSON数组
3. //JsonObjectRequest发送和接收JSON对象
4. //ImageRequest发送和接收Image
5. //如StringRequest
6. //这里有两个构造方法,一个是有method参数,一个是没有method参数的,那么没有method参数的默认为GET method
7. StringRequest(int method, String url, Listener<String> listener, ErrorListener errorListener)
8. StringRequest(String url, Listener<String> listener, ErrorListener errorListener)
3. 添加Request到RequestQueue
· 注意事项:
o 如果自己编译Volley的话,compileSdkVersion需要<=22,这是因为在Android6.0中Google移除了httpClient相关的API
o Volley仅适合用于通信频繁数据量小的网络操作
o 大数据量的网络操作并不适合Volley
· 工作原理图
· 使用步骤:
0. 创建RequestQueue
1. 创建Request对象
2. 添加Request对象到RequestQueue中
2.2网络_Okhttp
· 主页: https://github.com/square/okhttp
· OkHttp是一个高效的Http客户端,有如下的特点::
o 支持HTTP/2 和 SPDY
o 默认支持 GZIP 降低传输内容的大小
o 支持网络请求的缓存
o 当网络出现问题时,自动重试一个主机的多个IP 地址
· 配置: 添加依赖 compile 'com.squareup.okhttp3:okhttp:3.2.0'
· 使用步骤:
0. 创建OkHttpClient对象
1. 创建Request对象
2. 添加Request对象到OkHttpClient对象中并执行请求.示例代码:
1. OkHttpClient okHttpClient= new OkHttpClient();
-------Get 请求---------
2. //Get请求方式
3. //默认情况下,Request就是是使用Get请求
4. Request requestGet=new Request.Builder()
5. .url(URL_GET)
6. .build();
7. //默认情况下,Request就是是使用Get请求方式
8. Request requestGet=new Request.Builder()
9. .url(URL_GET)
10. .build();
11. //生成Call进行同步或者异步的调用
12. Call call= okHttpClient.newCall(requestGet);
13. //同步调用
14. // Response response = call.execute();
15. //异步调用
16. call.enqueue(new Callback() {
17. @Override
18. public void onFailure(Call call, IOException e) {
19. //请求失败的时候执行
20. }
21.
22. @Override
23. public void onResponse(Call call, Response response) throws IOException {
24. //网络请求成功响应
25. }
26. });
------Post 请求---------
27. RequestBody body= new FormBody.Builder()//请求体
28. .add("phone", "13812345678")//构造请求的参数
29. .add("key", "daf8fa858c330b22e342c882bcbac622")//构造请求的参数
30. .build();
31.
32. Request post_request= new Request.Builder()
33. .url(URL_POST)//指定请求的地址
34. .post(body)//指定请求的方式为POST
35. .build();
36. client.newCall(post_request).enqueue(new Callback() {
37. @Override
38. public void onFailure(Call call, IOException e) {
39. //请求失败的处理
40. }
41.
42. @Override
43. public void onResponse(Call call, Response response) throws IOException { //请求成功的处理
44. ResponseBody body= response.body();
45. String string= body.string();//把返回的结果转换为String类型
46. // body.bytes();//把返回的结果转换为byte数组
47. // body.byteStream();//把返回的结果转换为流
48. }
49. });
· 因为原生OkHttp的使用比较复杂,有一个包装过的工具项目okhttp-utils使用非常简单
o 添加依赖:
1. compile'com.zhy:okhttputils:2.3.8'
o 工具类简介:https://github.com/hongyangAndroid/okhttp-utils
代码写起来很简单,如下:
2. OkHttpUtils
3. .get()//如果是Post请求,用.post()
4. .url(URL)
5. .addParams("key","value")
6. .build()
7. .execute(new StringCallback() {
8. @Override
9. public void onError(Call call, Exception e) {
10. //可以直接在这里进行UI的操作
11. //网络访问错误
12. }
13.
14. @Override
15. public void onResponse(String response) {
16. //可以直接在这里进行UI的操作
17. //网络正常逻辑
18. }
19. });
2.3网络_Retrofit
· 主页: https://github.com/square/retrofit
· 功能:
o 效率非常高
o 可以直接将结果转换称Java类
o 可以配合RxJava一起使用
· 配置:
o 添加Retrofit依赖: compile 'com.squareup.retrofit2:retrofit:2.0.2'
o 添加数据解析依赖,根据实际情况进行选择
§ Gson : com.squareup.retrofit2:converter-gson:2.0.2
§ Jackson : com.squareup.retrofit2:converter-jackson:2.0.2
§ Moshi : com.squareup.retrofit2:converter-moshi:2.0.2
§ Protobuf : com.squareup.retrofit2:converter-protobuf:2.0.2
§ Wire : com.squareup.retrofit2:converter-wire:2.0.2
§ Simple XML : com.squareup.retrofit2:converter-simplexml:2.0.2
· 使用步骤:
0. 创建JsonBean(可以用工具生成)
1. 把Http Api 转化为 java interface.
0. /**
1. *对应Http接口的Java Interface类
2. */
3. interface HttpApi {
4.
5. //网络请求方式,请求Url
6. @GET("home")
7. Call<HomeResponse> getHomeData();
8.
9. /*GET有参数请求:
10. 1、可以在url后面直接进行参数拼接,比如 @GET("home?key=value&key2=value2")
11. 2、可以用@Query进行参数设置,可以有多个
12. 3、可以用@QueryMap进行参数设置用Map集合进行参数
13. */
14. @GET("home")
15. Call<HomeResponse> getHomeData(@Query("key1") String value1, @Query("key2") String value2);
16.
17. @GET("home")
18. Call<HomeResponse> getHomeData(@QueryMap Map<String, String> params);
19.
20.
21. /*POST有参数请求:
22. 1、可以用@Field进行参数设置,可以有多个
23. 2、可以用@FieldMap进行参数设置用Map集合进行参数
24. */
25. @FormUrlEncoded
26. @POST("search")
27. Call<SearchResponse> search(
28. @Field("keyword") String keyword,
29. @Field("page") String page,
30. @Field("pageNum") String pageNum,
31. @Field("orderby") String orderby
32. );
33.
34. @FormUrlEncoded
35. @POST("search")
36. Call<SearchResponse> search(
37. @FieldMap Map<String, String> params
38. );
39.
40.
41. }
§
0. 创建Retrofit对象,并发起请求.示例代码:
0. //3.1创建Retrofit实例,进行接口实现
1. retrofit= new Retrofit
2. .Builder()
3. .baseUrl(baseUrl)
4. .addConverterFactory(GsonConverterFactory.create())
5. .build();
6. //3.2实例化接口类
7. HomeApi homeApi= retrofit.create(HomeApi.class);
8. //3.3调用接口的方法得到Call
9. Call<HomeResponse> homeResponseCall= homeApi.getHomeData();
10. //3.4执行数据的请求操作,可以用同步或者是异步的操作
11. //3.4.1同步操作,耗时操作需要在线程中执行
12. /*try {
13. Response<HomeResponse> homeResponseResponse = homeResponseCall.execute();
14. HomeResponse homeResponse = homeResponseResponse.body();
15.
16. } catch (IOException e) {
17. e.printStackTrace();
18. }*/
19.
20. //3.4.2异步的操作,与okhttp的异步执行不同的是,可以在回掉的方法中进行UI的控制操作
21. homeResponseCall.enqueue(new Callback<HomeResponse>() {
22. @Override
23. public void onResponse(Call<HomeResponse> call, Response<HomeResponse> response) {
24. HomeResponse homeResponse= response.body();
25. textView.setText(homeResponse.toString());
26. textView.setTextColor(Color.GREEN);
27. }
28.
29. @Override
30. public void onFailure(Call<HomeResponse> call, Throwable t) {
31. textView.setText(t.getMessage());
32. textView.setTextColor(Color.RED);
33. }
34. });
· 常用注解:
o 请求方法:@GET / @POST / @PUT / @DELETE / @HEAD
o URL处理
1、拼接注意,建议baseUrl用“/”结尾,接口中url不用"/"开头
例子:baseUrl=http://10.0.2.2:8080/market/ url=home
错误案例
0. 案例一:
1. baseUrl=http://10.0.2.2:8080/market url=home
2. --->http://10.0.2.2:8080/home
3. 分析:默认用最后一个斜线去拼接
4.
5. 案例二:
6. baseUrl=http://10.0.2.2:8080/market url=/home
7. --->http://10.0.2.2:8080/home
8. 分析:url中开始的斜线代表主机地址http://10.0.2.2:8080
2、注解:
§ @Path - 替换参数
1. @GET("{path1}/{path2}")//注意:如果路径用“/”分割,就需要使用多个参数表示
2. public Call<ResponseData> groupList(@Path("path1") String path1,@Path("path2") String path2);
§ @Query - 添加查询参数,在GET请求中使用
3. @GET("home")
4. Call<HomeResponse> getHomeData(@Query("key1") String value1, @Query("key2") String value2);
§ @QueryMap - 如果有多个查询参数,把它们放在Map中,在GET请求中使用
5. @GET("home")
6. Call<HomeResponse> getHomeData(@QueryMap Map<String, String> params);
o
§ @Field单个字段,@FieldMap多个字段,把它们放在Map中,在Post请求中使用
@FormUrlEncoded 编码控制 与Post请求结合使用,不能缺少。
7. @FormUrlEncoded
8. @POST("search")
9. Call<SearchResponse> search(
10. @Field("keyword") String keyword,
11. @Field("page") String page,
12. @Field("pageNum") String pageNum,
13. @Field("orderby") String orderby
14. );
15. @FormUrlEncoded
16. @POST("search")
17. Call<SearchResponse> search(
18. @FieldMap Map<String, String> params
19. );
拓展:Retrofit是okhttp进化而来的,那么也是支持返回ResponseBody类型的,我们也可以直接使用返回数据类型ResponseBody来进行格式化字符串的获取。
20. //接口中的方法
21. @GET("home")
22. Call<ResponseBody> getHomeDataStr();
23.
24. //直接获取json字符串
25. retrofit.create(HttpApi.class)
26. .getHomeDataStr()
27. .enqueue(new Callback<ResponseBody>() {
28. @Override
29. public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
30. String resultStr=null;
31. if (response.isSuccessful()) {
32. ResponseBody body= response.body();
33. try {
34. resultStr= body.string();
35. } catch (IOException e) {
36. e.printStackTrace();
37. }
38. }
39. }
40.
41. @Override
42. public void onFailure(Call<ResponseBody> call, Throwable t) {
43.
44. }
45. });
· 优点:
·
android网络请求框架汇总相关推荐
- okhttp的应用详解与源码解析--android网络请求框架发展史
乘5G之势,借物联网之风,Android未来亦可期,Android优势在于开放,手机.平板.车载设备.智能家居等都是Android的舞台,Google不倒,Android不灭,本专栏的同步视频教程已经 ...
- Android网络请求框架之Retrofit(二)
前面一篇文章介绍了Retrofit的基本用法,没有看过的童鞋可以移步:Android网络请求框架之Retrofit(一),现在我们来继续介绍Retrofit配合RxJava.RxAndroid的用法. ...
- Retrofit网络请求框架使用简析——Android网络请求框架(四)
题记:-- 很累,累到想要放弃,但是放弃之后将会是一无所有,又不能放弃, 唯有坚持,唯有给自忆打气,才能更勇敢的走下去,因为无路可退,只能前行, 时光一去不复返,每一天都不可追回,所以要更珍惜每一存光 ...
- android网络请求框架_2020,最新APP重构:网络请求框架
在现在的app,网络请求是一个很重要的部分,app中很多部分都有或多或少的网络请求,所以在一个项目重构时,我会选择网络请求框架作为我重构的起点.在这篇文章中我所提出的架构,并不是所谓的 最好 的网络请 ...
- Volley网络请求框架简析——Android网络请求框架(三)
题记-- 人来到这个世界上,只有两件事情,生与死, 一件事完了,另一件事还急什么? 有缘而来,无缘而去, 识自本心,见自本性 不起妄缘,无心无为 自由自在,动静自如 冷暖自知,则是修行 1.初始化一个 ...
- Android网络请求框架之——okhttp3
一.出现的背景 提高网络请求性能,为高效而生. 二,使用前准备(以下使用Android Studio开发环境) (1)添加网络访问权限 <uses-permission android:name ...
- Android网络请求框架Volley的使用
Volley是Google在2013年推出的一款网络请求的框架,主要解决数据量小但是请求频繁的情况,对于大流量的比如文件上传下载,流媒体等则表现不佳.一般用于json获取,图片加载. 要想使用voll ...
- NoHttp使用简析——Android网络请求框架(二)
题记-- 静坐窗前,与明月为伴. 每一天都是一个新的开始,每一天都是一个新的心态,每一天的目标都是品好每一杯白开水. 生活的价值是活的有意义,而活的有意义就是生命的折腾. 在功夫的世界中,唯快不破,在 ...
- Okhttp使用简析——Android网络请求框架(一)
题记-- 慢慢地,我们都会变老,从起点走向终点,自然而必然,成长的途中,匆匆而又忙忙,跌跌而又撞撞,奔波而双小心,劳累而又费心,一生,留下什么,又得到什么,人生的脆弱和坚强都超乎自己的想象,看淡心境, ...
最新文章
- 多级菜单系统安装维护shell脚本实现企业级案例
- python适合零基础学习吗-零基础,经济学专业,适合自学Python吗?
- Soloπ:支付宝开源的Android专项测试工具
- 【CSS】学习笔记2 字体设置
- Protocol Buffers 编码原理
- Sql Server 分区
- 还怕Web 安全编程学不会?来这里,准没错!
- 极兔快递 | 快递单号查询API
- 中小企业适合引入OA办公系统吗?
- 微信小程序超出内容换行
- java使用阿里云发送通知短信
- 基于知识图谱的智能问答机器人
- 60mph和kmh换算_mph和kmh换算(mph换算器)
- java.io.FileNotFoundException: file:/xxx/xxx.jar!/BOOT-INF/classes!/xxx.xlsx (没有那个文件或目录)
- zookeeper 数据节点的增删改查
- 大数据专业就业前景及就业方向
- Jenkins ——你很神气
- my-view-isnt-reflecting-changes-ive-made-to-the-underlying-tables
- 43 岁硅谷技术大拿命丧街头,真凶落网:熟人作案,是 Expand IT 创始人
- 排位赛一 A Cow Gymnastics
热门文章
- Android中Apk加固之Dex文件的加密与解密
- Logistic 回归与 Softmax 回归在解决二分类问题的区别
- 电路设计--驱动放大电路设计
- dell服务器的raid磁盘管理器型号,Dell服务器PERC H310/H710/H810 RAID磁盘成员的在线管理和维护...
- Spring Bean的作用域(作用范围)
- UART总线协议详解
- 查看python第三方库的依赖pkgs
- Egret引擎与Android端的交互----小白教程(含坑)
- 企业级微服务构建-01搭建和使用Maven私有仓库(Nexus)-09权限(Privileges)
- 自定义验证码输入控件