网络

使用网络库不要忘记添加网络权限

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网络请求框架汇总相关推荐

  1. okhttp的应用详解与源码解析--android网络请求框架发展史

    乘5G之势,借物联网之风,Android未来亦可期,Android优势在于开放,手机.平板.车载设备.智能家居等都是Android的舞台,Google不倒,Android不灭,本专栏的同步视频教程已经 ...

  2. Android网络请求框架之Retrofit(二)

    前面一篇文章介绍了Retrofit的基本用法,没有看过的童鞋可以移步:Android网络请求框架之Retrofit(一),现在我们来继续介绍Retrofit配合RxJava.RxAndroid的用法. ...

  3. Retrofit网络请求框架使用简析——Android网络请求框架(四)

    题记:-- 很累,累到想要放弃,但是放弃之后将会是一无所有,又不能放弃, 唯有坚持,唯有给自忆打气,才能更勇敢的走下去,因为无路可退,只能前行, 时光一去不复返,每一天都不可追回,所以要更珍惜每一存光 ...

  4. android网络请求框架_2020,最新APP重构:网络请求框架

    在现在的app,网络请求是一个很重要的部分,app中很多部分都有或多或少的网络请求,所以在一个项目重构时,我会选择网络请求框架作为我重构的起点.在这篇文章中我所提出的架构,并不是所谓的 最好 的网络请 ...

  5. Volley网络请求框架简析——Android网络请求框架(三)

    题记-- 人来到这个世界上,只有两件事情,生与死, 一件事完了,另一件事还急什么? 有缘而来,无缘而去, 识自本心,见自本性 不起妄缘,无心无为 自由自在,动静自如 冷暖自知,则是修行 1.初始化一个 ...

  6. Android网络请求框架之——okhttp3

    一.出现的背景 提高网络请求性能,为高效而生. 二,使用前准备(以下使用Android Studio开发环境) (1)添加网络访问权限 <uses-permission android:name ...

  7. Android网络请求框架Volley的使用

    Volley是Google在2013年推出的一款网络请求的框架,主要解决数据量小但是请求频繁的情况,对于大流量的比如文件上传下载,流媒体等则表现不佳.一般用于json获取,图片加载. 要想使用voll ...

  8. NoHttp使用简析——Android网络请求框架(二)

    题记-- 静坐窗前,与明月为伴. 每一天都是一个新的开始,每一天都是一个新的心态,每一天的目标都是品好每一杯白开水. 生活的价值是活的有意义,而活的有意义就是生命的折腾. 在功夫的世界中,唯快不破,在 ...

  9. Okhttp使用简析——Android网络请求框架(一)

    题记-- 慢慢地,我们都会变老,从起点走向终点,自然而必然,成长的途中,匆匆而又忙忙,跌跌而又撞撞,奔波而双小心,劳累而又费心,一生,留下什么,又得到什么,人生的脆弱和坚强都超乎自己的想象,看淡心境, ...

最新文章

  1. 多级菜单系统安装维护shell脚本实现企业级案例
  2. python适合零基础学习吗-零基础,经济学专业,适合自学Python吗?
  3. Soloπ:支付宝开源的Android专项测试工具
  4. 【CSS】学习笔记2 字体设置
  5. Protocol Buffers 编码原理
  6. Sql Server 分区
  7. 还怕Web 安全编程学不会?来这里,准没错!
  8. 极兔快递 | 快递单号查询API
  9. 中小企业适合引入OA办公系统吗?
  10. 微信小程序超出内容换行
  11. java使用阿里云发送通知短信
  12. 基于知识图谱的智能问答机器人
  13. 60mph和kmh换算_mph和kmh换算(mph换算器)
  14. java.io.FileNotFoundException: file:/xxx/xxx.jar!/BOOT-INF/classes!/xxx.xlsx (没有那个文件或目录)
  15. zookeeper 数据节点的增删改查
  16. 大数据专业就业前景及就业方向
  17. Jenkins ——你很神气
  18. my-view-isnt-reflecting-changes-ive-made-to-the-underlying-tables
  19. 43 岁硅谷技术大拿命丧街头,真凶落网:熟人作案,是 Expand IT 创始人
  20. 排位赛一 A Cow Gymnastics

热门文章

  1. Android中Apk加固之Dex文件的加密与解密
  2. Logistic 回归与 Softmax 回归在解决二分类问题的区别
  3. 电路设计--驱动放大电路设计
  4. dell服务器的raid磁盘管理器型号,Dell服务器PERC H310/H710/H810 RAID磁盘成员的在线管理和维护...
  5. Spring Bean的作用域(作用范围)
  6. UART总线协议详解
  7. 查看python第三方库的依赖pkgs
  8. Egret引擎与Android端的交互----小白教程(含坑)
  9. 企业级微服务构建-01搭建和使用Maven私有仓库(Nexus)-09权限(Privileges)
  10. 自定义验证码输入控件