retrofit的初步使用

文章目录
  1. 本篇文章从一个角度说明为什么retrofit会搭配rxjava一起使用
    1. 一.定义请求接口
    2. 二.封装retrofit工具类

本篇文章从一个角度说明为什么retrofit会搭配rxjava一起使用

一.定义请求接口

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
* 使用get请求
* @Get(网址)方法参数:网址中需要的参数
*/
public interface IRetrofitResult {

@GET("/nc/article/headline/T1348647853363/0-40.html")
Call<ResponseBody> getInfo();

//观察者
@GET("/nc/article/headline/T1348647853363/0-40.html")
Observable<Bean> getBean();
}

二.封装retrofit工具类

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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
/**
* 使用retrofit框架下载数据
*/
public class RetrofitUtils {

IOKgoResult<Response<ResponseBody>> result;
IOKgoResult<Bean> result2;

public void setResult(IOKgoResult<Response<ResponseBody>> result){
this.result = result;
}

public void setResult2(IOKgoResult<Bean> result2){
this.result2 = result2;
}

/**
* retrofit底层封装了OKHttp框架,真正的下载还是由OKHttp来实现
* 说明:使用enqueue()实现异步下载
*/
public void getStr(){

OkHttpClient client = new OkHttpClient.Builder().build();

Retrofit rbuilder = new Retrofit.Builder()
.baseUrl(Strings.BASE_URL)
.client(client).build();

IRetrofitResult retrofitResult = rbuilder.create(IRetrofitResult.class);
Call<ResponseBody> info = retrofitResult.getInfo();
info.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
result.getResult(response);
}

@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {

}
});
}

/**
* 使用retrofit执行下载,调用execute()执行同步请求
* 没有rxjava的时候,如果使用retrofit同步方式下载会报错
* 解决方式:1.new Thread
* 2.使用Rxjava
*/
public void getStr_tongbu(){

OkHttpClient client = new OkHttpClient.Builder().build();

Retrofit retrofit = new Retrofit.Builder().
client(client)
.baseUrl(Strings.BASE_URL)
.build();

IRetrofitResult retrofitResult = retrofit.create(IRetrofitResult.class);

Response<ResponseBody> bodyResponse;

try {
bodyResponse = retrofitResult.getInfo().execute();
result.getResult(bodyResponse);
} catch (IOException e) {
e.printStackTrace();
}
}

/**
* 使用retrofit同步+rxjava
*/
public void rxjavaTest(){

OkHttpClient client = new OkHttpClient.Builder().build();

Retrofit retrofit = new Retrofit.Builder().
client(client)
.baseUrl(Strings.BASE_URL)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();

IRetrofitResult retrofitResult = retrofit.create(IRetrofitResult.class);

//被观察者
Observable<Bean> observable = retrofitResult.getBean();
//被观察者订阅观察者(Observer是观察者)
/**
* 观察者创建的两种方式
* 方式一:new Observer
* 方式二:new Subscriber
* 区别:底层是将方式一转换为方式二执行,并且方式二新增onStart()方法
*/
// observable.subscribe(new Observer<ResponseBody>() {
// @Override
// public void onCompleted() {
//
// }
//
// @Override
// public void onError(Throwable e) {
//
// }
//
// @Override
// public void onNext(ResponseBody responseBody) {
//
// }
// });

// observable
// .observeOn(AndroidSchedulers.mainThread())
// .subscribeOn(Schedulers.io())
// .subscribe(new Subscriber<Bean>() {
// @Override
// public void onCompleted() {
//
// }
//
// @Override
// public void onError(Throwable e) {
//
// }
//
// @Override
// public void onNext(Bean responseBody) {
// result2.getResult(responseBody);
// }
// });

/**
* 观察者中的方法可以使用Action对象来单独处理
* subscribe()
*/
//处理next方法
Action1<Bean> onNext = new Action1<Bean>() {
@Override
public void call(Bean bean) {
result2.getResult(bean);
}
};

//处理异常的对象
Action1<Throwable> error = new Action1<Throwable>() {
@Override
public void call(Throwable e) {
Log.d("amy",e.getMessage());
}
};

observable
.observeOn(AndroidSchedulers.mainThread())
.subscribeOn(Schedulers.newThread())
.subscribe(onNext,error);
}
}