Retrofit + RxJava 的简单使用(2)

前言

  • Android 发展到今天各方面的框架已经非常成熟了,Github 上的一些大神把他们封装好的各种框架开源出来,方便了我们后来人,使我们简简单单的几行代码就能完成复杂的逻辑,
  • 本文主要介绍的是网络请求框架中的 Retrofit !
    Github 地址为:https://github.com/square/retrofit

  • 接上一篇的介绍:Android 中 Retrofit2.X 的使用(1)/)

一、简介

  • 目前 Android 中比较流行的网络请求框架大致有三种:volly 、okhttp 、Retrofit !

  • 关于这几种网络请求框架的对比,请看 帅比张

  • 为什么选择 Retrofit 呢,性能好,也是目前比较流行的一个框架,并且配合 Rxjava 使网络请求变得更加简单,对 Rxjava 不了解的可以看看这篇文章:
    http://gank.io/post/560e15be2dca930e00da1083#toc_1

  • Retrofit 的门槛有点高,如果只是简单的使用还好,但是要想完全弄透彻,必须要花时间,下功夫去学!

  • 使用 Retrofit 的前提是服务器端代码遵循 REST 规范

二、使用

2.1 首先是添加依赖
1
2
3
4
5
6
compile 'com.squareup.retrofit2:retrofit:2.2.0'
//Retrofit在默认情况下只能将Http的响应体反序列化到OkHttp的ResponseBody中,
//加入Converter可以将返回的数据直接格式化成你需要的样子,而我们最常用的就是
//Gson , 返回的结果直接转化为对象
compile 'com.squareup.retrofit2:converter-gson:2.2.0'
compile 'com.google.code.gson:gson:2.8.0'
2.2 在使用之前,还需要定义一个接口,作为网络请求的格式,如下所示
1
2
3
4
5
6
7
8
9
public interface RetrofitText {
@GET("")
Call<RetrofitTextBean> getRequest2(@Url String url ,
@Query("market_id") int markret_id ,
@Query("floor_start") int floor_start ,
@Query("floor_end") int floor_end );
}

另外,还需要准备一个与 json 字符串对应的 javaBean ,这样返回的结果直接是 javaBean 对象。

2.3 开始使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//1.创建 Retrofit 实例,并完成相关配置
Retrofit retrofit = new Retrofit.Builder()
//baseUrl 与 接口中的 url 连接组成完整的 Url
.baseUrl(baseUr)
//表示调用 Gson 库来解析返回值
.addConverterFactory(GsonConverterFactory.create())
.build();
//2.创建接口对象,即 RetrofitText 接口的对象
RetrofitText retrofitText = retrofit.create(RetrofitText.class);
//3.获取请求服务方法
Call<RetrofitTextBean> call = retrofitText.getRequest2(relativeUrl, 1, 5, -3);
//4.开始异步请求
call.enqueue(new Callback<RetrofitTextBean>() {
@Override
public void onResponse(Call<RetrofitTextBean> call, Response<RetrofitTextBean> response) {
//请求成功
String s = response.body().toString();
String message = response.message();
Log.i("retrofit", s);
}
@Override
public void onFailure(Call<RetrofitTextBean> call, Throwable t) {
//请求失败
Log.i("retrofit", "请求失败");
}
});
2.4 以上请求,只是一个简单的 Get 请求,网上的资料很多,我这里附上几篇链接

三、Retrofit 配合 Rxjava 使用

附上几篇讲的不错的链接:

3.1 需要在之前依赖的基础上再添加依赖
1
2
3
4
//RxJava
compile 'io.reactivex:rxjava:1.3.0'
compile 'io.reactivex:rxandroid:1.2.1'
compile 'com.squareup.retrofit2:adapter-rxjava:2.2.0'
3.2 修改接口如下
1
2
3
4
5
//将 call 换成 Observable 被观察者
@GET("sapientialMall/getLadderInfo.action")
Observable<RetrofitTextBean> getRequest3(@Query("market_id") int markret_id ,
@Query("floor_start") int floor_start ,
@Query("floor_end") int floor_end );
3.3 代码中使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
//1.创建 Retrofit 实例,并完成相关配置
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUr)
//表示调用 Gson 库来解析返回值
.addConverterFactory(GsonConverterFactory.create())
//配合 rxjava 需要添加这行代码
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
//2.创建接口对象,即 RetrofitText 接口的对象
RetrofitText retrofitText = retrofit.create(RetrofitText.class);
Observable<RetrofitTextBean> observable = retrofitText.getRequest3(1, 5, -3);
//指定网络请求在 io 线程
observable.subscribeOn(Schedulers.io())
//指定数据处理在主线程
.observeOn(AndroidSchedulers.mainThread())
//被观察者与观察者建立联系
.subscribe(new Observer<RetrofitTextBean>() {
@Override
public void onCompleted() {
Toast.makeText(getApplicationContext(),"请求完成",Toast.LENGTH_SHORT).show();
}
@Override
public void onError(Throwable e) {
textview.setText(e.getMessage());
}
@Override
public void onNext(RetrofitTextBean retrofitTextBean) {
int code = retrofitTextBean.getCode();
String msg = retrofitTextBean.getMsg();
textview.setText("code:"+code+"---msg:"+msg);
}
});
3.4 以上都是些基础应用,要想完全使用,还必须了解 RxJava ,下方的链接中有详解!

附上几篇 Rxjava 的链接,算是自己总结的笔记吧: