本文主要对Android中经常使用的网络请求框架Retrofit做简单介绍,抛砖引玉,希望可以帮大家快速入门Retrofit的使用。
本文目录如下:
Retrofit介绍
Retrofit是Square公司开发的一款针对Android和java的网络请求框架,遵循Restful设计风格,底层基于OkHttp。
Retrofit具有以下主要功能:
- 支持同步/异步网络请求
- 支持多种数据的解析&序列化格式(Gson、json、XML等等)
- 通过注解配置网络请求参数
- 提供对Rxjava的支持高度解耦,使用方便
相比去其他网络请求框架,其具有性能特别棒、使用特别方便的特性,所以在任何网络请求场景下,我们都应该有限考虑Retrofit,本文就Retrofit的入门使用和简单特性做简单介绍,抛砖引玉,希望大家可以爱上Retrofit。
基础使用步骤
我们首先通过一个简单的案例带大家走一遍使用Retrofit的完整流程,然后再深入介绍Retrofit的一些特性。
我们要做的就是在Android中使用Retrofit发起网络请求,将下图(图片地址:http://picture-pool.oss-cn-beijing.aliyuncs.com/2019-06-29-121904.png)下载并展示出来,下面我来一步一步介绍如何去做。
添加依赖
在Gradle文件中添加如下依赖:
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
声明网络权限
在Android的manifest配置文件中声明网络请求权限:
创建用于配置网络请求的接口
Retrofit将 Http请求抽象成 Java接口,采用注解来描述配置网络请求参数,何为配置网络请求参数?说白了就是设置网络请求的地址是什么、使用什么请求方法、传递的参数是什么、返回值类型是什么等等一系列配置信息,通过接口描述清楚这些具体的网络配置信息,Retrofit才能根据你的配置发起最终的网络请求。所以我们首先应该声明一个用于配置网络请求的Java接口:
/** * @author dmrfcoder * @date 2019-06-29 */public interface GetRequestInterface { /** * * * 通过get()方法获取图片的请求接口 * GET注解中的参数值"2019-06-29-121904.png"和Retrofit的base url拼接在一起就是本次请求的最终地址 * * @return * */ @GET("2019-06-29-121904.png") Call getPictureCall();}
创建Retrofit实例并发起网络请求
这里直接给出代码,重点都在注释中:
public void retrofitGet() { /* 创建Retrofit对象,这里设置了baseUrl,注意我们在声明网络配置接口GetRequestInterface的时候在GET注解中也声明了一个Url, 我们将会这里的baseUrl和GET注解中设置的Url拼接之后就可以形成最终网络请求实际访问的url */ Retrofit retrofit = new Retrofit.Builder().baseUrl("http://picture-pool.oss-cn-beijing.aliyuncs.com/").build(); //创建网络请求配置的接口实例 GetRequestInterface getRequestInterface = retrofit.create(GetRequestInterface.class); //调用我们声明的getPictureCall()方法创建Call对象 Call requestBodyCall = getRequestInterface.getPictureCall(); //使用requestBodyCall发起异步网络请求 requestBodyCall.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { //将网络请求返回的数据解析为图片并展示到界面 ResponseBody body = response.body(); InputStream inputStream = body.byteStream(); Drawable drawable = Drawable.createFromStream(inputStream, "pic.png"); imageView.setBackground(drawable); Log.e(TAG, "网络请求成功"); } @Override public void onFailure(Call call, Throwable t) { Log.e(TAG, "网络请求失败,失败原因:" + t.getMessage()); } }); }
如果使用过OkHttp的读者可能很熟悉最后两步创建Call对象、发起异步网络请求的操作,几乎和OkHttp一模一样,这是因为Retrofit就是基于OkHttp的啊~~
最终效果如下:
细心的读者可能发现了一个问题,在上面的代码中我是直接在CallBack接口的onResponse()回调方法中更新的ImageView,即在onResponse()中更新UI的,在OkHttp中这个onResponse()方法是在子线程中被调用的,而在Retrofit中,onResponse()和onFailure()这两个回调方法都是在主线程进行调用的,所以可以在其中直接更新UI,这也是Retrofit和OkHttp的一点不同之处。