retrofit的初步使用
本篇文章从一个角度说明为什么retrofit会搭配rxjava一起使用
一.定义请求接口
/**
* 使用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工具类
/**
* 使用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);
}
}