Android网络连接与云服务2--执行网络操作

连接到网络

最常用的网络请求库

Android-Async-Http、Volley、OkHttp3、Retrofit2.


一、为什么要使用网络开源框架
1. Android系统自带网络请求
Android系统自带的网络请求模块有两个,一个是HttpClient,另一个是HttpUrlConnection。

3. 存在的问题
①上述两个框架并没有针对异步调用的一个封装,使用时必须自己去new一个线程;
②没有线程池,没有网络缓存,不能重复利用请求,性能不佳;
③返回的数据必须自己解析,没有json解析框架。

2. 网络开源框架的可以解决那些问题

网络请求开源库是一个将网络请求的相关功能封装好的类库,并对外提供Api:

没有网络请求框架之前
App想与服务器进行网络请求交互是一件很痛苦的事:因为Android的主线程不能进行网络请求,还需要另外开一个线程进行请求,然后又要考虑到线程池,缓存等一堆问题。

使用网络请求框架后
实现网络请求的需求同时不需要考虑:异步请求、线程池、缓存、json解析
  • 同时还:降低开发难度,缩短开发周期,使用方便

  • 、目前流行的网络框架
1. 目前流行的网络框架有哪些
目前流行的框架主要有四种:Android-Async-Http、Volley、OkHttp3、Retrofit2.0

网络请求框架本质上是一个将网络请求的相关方法( HttpClient或HttpURLConnection)封装好的类库,并实现另开线程进行请求和处理数据,从而实现整个网络请求模块的功能。具体的关系可看下图:
2. Android-Async-Http
推出的时间最早,目前作者已经停止更新,Android 5.0后不推荐使用。特点:
①自动智能请求重试
②支持同步、异步请求
③保存cookie到应用的sharepreference
自动智能请求重试在很多APP中比较鸡肋,在很多下拉刷新的APP中用户体验很不好,而且框架中自动重试是默认开启的,需要去显式的关闭。

3. Volley
基于HttpUrlConnection,Volley的request请求和response都是把数据放在byte数组里,不支持输入输出流。如果大文件多了,数组就会非常大,消耗内存,所以volley不适用下载和上传文件的网络操作。适合轻量级网络交互,网络请求频繁,传输数据量小的场景。
①封装了UIL图片加载框架,支持图片加载
②网络请求排序,优先级处理
③多级别取消
④和activity生命舟曲联动,生命周期结束同时取消所有网络请求
⑤扩展性好,可支持okhttp


4. OkHttp3
不基于HttpClient和HttpUrlConnection,是比前两种更高性能的网络请求,它是一个封装类似HttpUrlConnection的一个东西,Android 4.4之后HttpUrlConnnection部分实现已经与okhttp一致,证明了okhttp的高性能。特点:
①支持PDY,共享同一个socket来处理同一个服务器的所有请求
②支持同步、异步请求
③保存cookie到应用的sharepreference
④封装了线程池、数据转换、参数使用、错误处理等
⑤无缝的支持GZIP来减少数据流量,使用比HttpUrlConnection更方便
⑥缓存响应数据来较少重复的网络请求
⑦能从很多常用的连接问题中自动恢复
⑧解决了代理服务器问题和SSL握手失败问题
⑨基于NIO和okio,所以性能更好,请求、处理速度快

5. Retrofit2.0
基于Okhttp,而且更为出色,具有okhttp所有的优点,而且
①restful api设计风格
②通过注解配置请求,包括请求方法、请求参数、请求头、返回值等
③可以搭配多种Converter将获得的数据解析,支持Gson、jackson、Protobur等
④提供Rxjava支持

Retrofit2.0性能最好,简洁易用,可扩展rxjava,但是缺点也很明显,注解、rxjava等的使用存在很高的门槛;扩展性较差,高度封装后的必然结果。

解析 XML 数据


管理网络的使用情况

1、检查设备的网络连接

检查了 Wi-Fi 与移动网络的网络连接。它检查了这些网络接口是否可用(也就是说网络是通的)及是否已连接(也就是说网络连接存在,并且可以建立 socket 来传输数据。

private static final String DEBUG_TAG = "NetworkStatusExample";
...
ConnectivityManager connMgr = (ConnectivityManager)
        getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
boolean isWifiConn = networkInfo.isConnected();
networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
boolean isMobileConn = networkInfo.isConnected();
Log.d(DEBUG_TAG, "Wifi connected: " + isWifiConn);
Log.d(DEBUG_TAG, "Mobile connected: " + isMobileConn);

2、检测网络连接变化



举例

1、Volley

同步/异步请求、解析、缓存

扫描二维码关注公众号,回复: 2646022 查看本文章

StringRequest

/**
 * volley应用一: HTTP网络请求
 */
//method请求方法 url请求路径,Listener请求成功的监听的回调,ErrorListener请求失败的监听回调
private void stringRequestGet() {
    StringRequest mStringRequestGet = new StringRequest("https://www.baidu.com/",
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    Log.e(TAG, response);
                    Log.e(TAG, "stringRequestGet thread id  : " + Thread.currentThread().getId());
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, error.getMessage(), error);
        }
    });

    //请求加入到RequestQueue
    mQueue.add(mStringRequestGet);
}


JsonObjectRequest



ImageRequest



ImageLoader

ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。


注意:图片加载框架

Android发展到现在,各种图片加载框架也是层出不群。从刚开始的Android-Universal-Image-Loader,到后来Google推出的Volley,再到现在的Fresco,Picasso,Glide百花齐放,总有一款适合你。(后面专门写一篇博客讨论)


2、OkHttp3

2.1 与网络交互步骤

请求:

可以实现同步请求和异步请求;

OkHttpClient client发送请求,Request.Builder()创建request请求对象,加入requestqueue,


1.OKHttp3同步的使用方法

  1. OkHttpClient okHttpClient = new OkHttpClient(); //1.定义一个client
  2. Request request = new Request.Builder().url( "http://www.baidu.com").build(); //2.定义一个request
  3. Call call = okHttpClient.newCall(request); //3.使用client去请求
  4. try {
  5. String result = call.execute().body().string(); //4.获得返回结果
  6. System.out.println(result);
  7. } catch (IOException e) {
  8. e.printStackTrace();
  9. }



2.OKHttp3异步的使用方法

  1. OkHttpClient okHttpClient = new OkHttpClient(); //1.定义一个client
  2. Request request = new Request.Builder().url( "http://www.baidu.com").build(); //2.定义一个request
  3. Call call = okHttpClient.newCall(request); //3.使用client去请求
  4. call.enqueue( new Callback() { //4.回调方法
  5. @Override
  6. public void onFailure(Call call, IOException e) {
  7. }
  8. @Override
  9. public void onResponse(Call call, Response response) throws IOException {
  10. String result = response.body().string(); //5.获得网络数据
  11. System.out.println(result);
  12. }


解析:

通过Gson解析


缓存:

OkHttp3中关于缓存的类,我们使用的最多的是:Cache类和ControlCache类,其中前者用于指定缓存的地址和大小,后者用于对缓存进行各种控制,ControlCache又有其构建者类Builder。


Retrofit2.0




总结

下面是简单介绍:

网络请求加载 - 介绍

一图让你了解全部的网络请求库和他们之间的区别!

网络请求库 - 对比




调试工具

postman



引用文章的出处,感谢作者:

1、Android 开源网络框架(Android-Async-Http、Volley、OkHttp3、Retrofit2.0)对比

https://blog.csdn.net/jasonwang18/article/details/55669118

2、这是一份很详细的 Retrofit 2.0 使用教程(含实例讲解)

http://blog.csdn.net/carson_ho/article/details/73732076

猜你喜欢

转载自blog.csdn.net/haobobo710/article/details/80928681