单独开一篇详细的讲一下Retrofit,即使依旧是以okhttp为底层,但在我学习的时候,他引导出更多的需要学习的新知识,所以着重介绍一下,也做一个下一部分的开篇。
1. Retrofit
在第一次接触的时候,傻乎乎的看着官方的文档,完全不明白他到底是怎样的工作方式,这里的第一个障碍就是注解。在java的学习过程中,没有系统的学习过注解的使用,而安卓对注解的使用在今后越来越广泛。所以下一篇会对注解进行介绍。
本次直接进行retrofit部分的介绍。
1. 概述
首先retrofit是一个RESTful的Http网络请求框架的封装,而在上面我说过,其实Retrofit的底层是okhttp。在Retrofit 2.0时,内置Okhttp,前一篇介绍了okhttp的高效的网络请求。而Retrofit的部分就在于封装,使用注解也更多的是为了解耦,讲请求部分与数据操作部分更好的隔离开。这也是注解的一大使用特点。
2. 在使用前:compile 'com.squareup.retrofit2:retrofit:2.0.2'
3. 定义接口:
public interface LoginApi {
@FormUrlEncoded
@POST("login")
Call<LoginBean> getLogin(@Field("username") String username,
@Field("password") String password);
}
在使用前,我们拥有了一个网络请求的http链接,上方使用的是post请求,即第二行注解,而使用post请求需要进行编码的即第一行注解,创建方法,返回值是泛型为LoginBean的回调,方法名为getLogin,内部参数第一个为username,对应username,第二个参数为password,对应password。
4. 对应的Bean
这里需要介绍的就是一个插件了,在我们进行代码的书写之前,后端们都会提供这样的接口文档,也能够有示例json,而使用这个json生成对应的bean进行数据请求之后的存取,这里使用到了android studio的一个json生成bean的插件:
将接口文档中示例的json格式的请求结果进行格式生成对应的bean类:。而我们在定义接口时也是直接获取bean类,不在获取响应体。
5. 创建Retrofit
public static Retrofit RetrofitConfig(){
return mRetrofit = new Retrofit.Builder()
.baseUrl(BaseUrl.basUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
使用时创建retrofit对象的流程是:构造器模式,传入基础url,添加gson解析工厂,创建对象。
- 传入的基础url继访问的url前缀,例如:
http://gank.io/api/
这是一个前缀,即之后的访问,Get请求或是post请求都将以此为基础,get请求即是在此基础之后续写传入的数据。 - 添加工厂模式创建的gson解析工厂,gson是android转为解析json格式数据的类,入上方的loginbean即是gson解析了json格式数据之后直接解析出来之后直接生成的loginbean对象。
6. 发送请求
mRetrofit.create(LoginApi.class)
.getLogin(username, password)
.enqueue(new Callback<LoginBean>() {
@Override
public void onResponse(Response<LoginBean> response, Retrofit retrofit) {
//请求成功之后。。
}
@Override
public void onFailure(Throwable throwable) {
SnackBarUtils.SnackBarLong(login_bt_login, "网络连接失败!╥﹏╥...");
}
});
- 创建连接:使用之前创建的LoginApi的接口,内部我们使用getlogin方法,传入的数据为登录时获取的账户密码。
- 添加至请求队列:内部需要回调,即getLogin方法的回调。
- 成功则进入onResponse方法,失败进入onFailure方法。
Retrofit还有一大优点,内部源码使用handler实现了异步与主线程等的数据传输,能够直接在请求成功后进行ui修改的操作。
未完待续(
//TODO java注解
//TODO Rxjava+Retrofit
//TODO MVVM与MVP
//TODO NoHttp)