网络
使用网络库不要忘记添加网络权限
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
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. });
· 优点:
·