Android网络通信 | 青训营笔记

287 阅读5分钟

这是我参与「第四届青训营 」笔记创作活动的的第6天

一、前言

对应绝大部分应用来说,都离不开网络通信,通过网络通信可以让你的App更加的精彩丰富,比如实现实时新闻、聊天等功能。
文章的主要内容如下:

  • 网络框架对比
  • OkHttp的使用
  • Retrofit的使用

二、网络框架对比

image.png

HttpURLConnection

HttpURLConnection是一个简单的请求类,如果用它实现一个规范化的请求,需要自己去完成很多内容的封装:线程池的管理、数据解析、请求日志等。所以我们一般不会直接用它,当然它的好处就是不需要引入新的包。

Volley

Volley也是Google官方推出的网络请求库,它不适合用来文件的上传与下载,而且现在停更了,因此也不推荐使用。

OkHttp & Retrofit

OkHttp是square公司推出的网络请求库,它可以设置拦截器,支持大文件上传和下载。而且基于NIO和Okio,它的性能会更好。
Retrofit也是square公司的产品,它可以看作OkHttp的封装,它拥有restful api设计风格,支持通过注解配置请求,还可以搭配各种Converter去将获取到的数据进行解析。

三、OkHttp的使用

1. 引入包

在项目下的app目录中的build.gradle中的dependencies中添加依赖

dependencies {
    implementation("com.squareup.okhttp3:okhttp:4.10.0")
}

2. 开始使用

开始使用之前,我们需要在清单文件中添加网络请求权限。

<uses-permission android:name="android.permission.INTERNET"/>

我以每日一言的接口为例,为大家介绍一下怎么使用OkHttp。

Get请求

首先我们要创建一个OkHttpClient实例。

OkHttpClient client = new OkHttpClient();

接着我们创建一个请求实例,在build()之前我们可以设置很多内容,url表示我们要请求的对应网址,addHeader可以添加首部,还有很多方法,这里就不一一介绍了。

Request request = new Request.Builder()
        .url("https://saying.api.azwcl.com/saying/get")
        .build();

接着通过我们的OkHttpClient实例调用newCall方法传入我们的请求request,并返回一个Call对象。我们可以通过调用call对象的enqueue方法发送请求,并传入一个回调函数来接收响应信息。

OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
        .url("https://saying.api.azwcl.com/saying/get")
        .build();
Call call = client.newCall(request);
call.enqueue(new Callback() {
    @Override
    public void onFailure(@NonNull Call call, @NonNull IOException e) {
        Log.d(TAG,"网络请求失败");
    }

    @Override
    public void onResponse(@NonNull Call call, @NonNull Response response) throws IOException {
        Log.d(TAG,"网络请求成功");
        Log.d(TAG,"响应内容:" + response.body().string());
    }
});

然后我们看一下log,一个请求就成功了。

image.png

POST请求

对于POST请求,我们需要传入数据。
首先创建一个RequestBody对象来存放参数。

RequestBody formBody = new FormBody.Builder()
        .add("key", "value")
        .build();

然后将我们的RequestBody对象添加到请求中。

Request request = new Request.Builder()
        .url("xxx")
        .post(formBody)
        .build();

最后再根据通过newCall发送请求即可,后面的操作和Get请求一样。
OkHttp官网:square.github.io/okhttp/

四、Retrofit的使用

1. 引入包

在项目下的app目录中的build.gradle中的dependencies中添加依赖

dependencies {
    // Retrofit
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    // Gson - json数据的转换器
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
}

2. 开始使用

开始使用之前,我们需要在清单文件中添加网络请求权限。

<uses-permission android:name="android.permission.INTERNET"/>

我以每日一言的接口为例,为大家介绍一下怎么使用Retrofit。

构建实体类

首先我们看一下接口的返回数据,我们以面向对象的方式根据下面的数据构建出实体类。

{"code":200,"data":{"author":"休谟","content":"用在事业上的精力,应该在多字上"}}

实体类如下。

public class Word {

    private String author;

    private String content;

    // getter、setter
    ...

    @Override
    public String toString() {
        return "Word{" +
                "author='" + author + ''' +
                ", content='" + content + ''' +
                '}';
    }
}
public class Response {

    private int code;

    private Word data;

    // getter、setter
    ...

    @Override
    public String toString() {
        return "Response{" +
                "code=" + code +
                ", data=" + data +
                '}';
    }
}

编写请求接口

可以看到,我们这里并没有写我们的接口网址前部分,这个后面会说到。

public interface MyService {

    @GET("/saying/get")
    Call<Response> getDaySaying();

}

发送请求

首先创建一个Retrofit.Builder的实例并设置好baseUrl以及数据转换器。
通过这个baseUrl我们可以把同一个网址前缀的接口统一提取出来,这个更贴近我们实际的开发。

Retrofit build = new Retrofit.Builder()
        .baseUrl("https://saying.api.azwcl.com")
        .addConverterFactory(GsonConverterFactory.create())
        .build();

然后通过这个build实例去创建我们接口的动态代理对象。

MyService myService = build.create(MyService.class);

然后再通过myService去调用我们的接口,返回的是一个Call,然后调用它的enqueue方法发送请求。
可以看到这里与不添加GsonConverterFactory的区别,这里我们请求成功之后返回的response中的body()方法返回的对象是我们之前创建好的实体类,这样更方便我们的工作。

Retrofit build = new Retrofit.Builder()
        .baseUrl("https://saying.api.azwcl.com")
        .addConverterFactory(GsonConverterFactory.create())
        .build();
MyService myService = build.create(MyService.class);
Call<Response> daySaying = myService.getDaySaying();
daySaying.enqueue(new Callback<Response>() {
    @Override
    public void onResponse(Call<Response> call, retrofit2.Response<Response> response) {
        Log.d(TAG, "onResponse: " + response.body());
    }

    @Override
    public void onFailure(Call<Response> call, Throwable t) {
        Log.d(TAG, "onFailure: 请求失败" );
    }
});

然后我们看一下log,一个请求就成功了。

image.png Retrofit官网:square.github.io/retrofit/

五、总结

这里主要为大家介绍了android中常用的网络请求框架,以及比较热门的OkHttp与Retrofit的简单使用。
当然我比较推荐大家使用Retrofit。
相信很多学过Spring框架的小伙伴们看到Retrofit中我们创建的接口和Spring中Controller的方法很像,所以这更方便了我们的开发。
Retrofit除了以上的使用,还可以结合RxJava进行使用,返回Observable、Flowable等可以观察的对象。 还可以通过设置拦截器,去记录请求的日志或添加全局header等等操作,这些我就不一一介绍了。

六、结语

如果喜欢或有所帮助的话,希望能点赞关注,鼓励一下作者。
如果文章有不正确或存疑的地方,欢迎评论指出。

参考

juejin.cn/post/712345…