您的位置:首页 > 理论基础 > 计算机网络

Retrofit2、okHttp3、RxAndroid使用

2017-08-04 14:11 316 查看
前三篇讲了RxAndroid 、okHttp3 、Retrofit2的使用,接下来就看看这些东西怎么用吧。

还记得okHttp和Retrofit中的返回值Call吗,现在我们就是要把它变为RxAndroid中的被观察者Observable,然后建立和观察者之间的关联。

前一篇我们转换了Call< T>的T的类型为自己想要的东西,我们引入了Converter转换器,这里我们引入CallAdapter,来转化Call,这里我们主要是想要用RxAndnroid所以就把Call转为Observable。

1、同样要在Module的build.gradle中添加依赖

//retrofit    返回值的adapter的转化器,为了于RxJava配合使用
compile 'com.squareup.retrofit2:adapter-rxjava:2.3.0'


2、定义接口

可以看到吧,Call已经换成了Observable,注意这里的T也就是之前说的ResponseBody也换成了String,所以不要忘了添加转换器的依赖

public interface MyConverterService {

@GET("session")
@Headers("X-Oc-Merchant-Id:1qaz2wsx")
Observable<String> getSession();
}


3、调用

private void converter() {
//创建retrofit,并设置基地址、添加两个转换器Converter和CallAdapter
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.xxx.com/api/rest/")
.addConverterFactory(ScalarsConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();

//得到接口
MyConverterService converterService = retrofit.create(MyConverterService.class);

//通过接口调用方法
Observable<String> observable = converterService.getSession();

//建立观察者和被观察者之间的关联
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<String>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {

}

@Override
public void onNext(String s) {
Log.e("------------->","s"+s);
}
});
}

//扩展
//可以使用map,faltMap,compose进行转换
converterService.getSession().map(new Func1<String, Session>() {
@Override
public Session call(String s) {

return new Gson().fromJson(s, Session.class);
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<Session>() {
@Override
public void onCompleted() {
Log.e("----------->", "onCompleted");
}

@Override
public void onError(Throwable e) {
Log.e("----------->", "onError" + e);
}

@Override
public void onNext(Session session) {
Log.e("-------------->", " converter  --- session" + session.getData().getSession());
}
});


4、获取请求头,和请求码

说明

注意返回值为:Observable< Response< String >>

1、要想获取请求头和请求码需要用到Response< T >,retrofit2包下的;或者Observable< Result< T>> ,retrofit2.adapter.rxjava包下的;

2、注意不管哪种,T都一定要给相应的类型,否则报错。

1)接口

/**
* 用Observable<Response<T>> 代替 Observable<T> ,这里的Response指retrofit2.Response
* 就可以获取请求码和头部了
* @return
*/
@GET("session")
@Headers("X-Oc-Merchant-Id:1qaz2wsx")
Observable<Response<String>> getHeaderByResponse();

/**
* 用Observable<Result<T>> 代替 Observable<T>,这里的Result是指retrofit2.adapter.rxjava.Result,这个Result中包含了Response的实例,
* 就可以获取头和请求码了
* @return
*/
@GET("session")
@Headers("X-Oc-Merchant-Id:1qaz2wsx")
Observable<Result<Session>> getHeaderByResult();


2)调用

/**
* 使用Response获取请求码,方式一方式二是要说明要活学活用,去灵活的转换拿到自己想要的返回值类型。
*
* 还要注意body()方法返回值的类型
*/
private void getResponse() {

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.xxx.com/api/rest/")
.addConverterFactory(ScalarsConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();

//方式一:返回值为json,由于添加的返回值的转换器为字符串转换器,body是字符串
retrofit.create(MyConverterService.class).getHeaderByResponse().subscribeOn(Schedulers.io()).subscribe(new Observer<Response>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {

}

@Override
public void onNext(Response response) {
Log.e("----------->", "code " + response.code());
Log.e("----------->", "header" + response.headers());
Log.e("----------->", "body" + response.body());
}
});

//方式二:如果想要什么样式,自己通过map转换(RxJava知识),如果要一个对象可以直接使用Gson转换器得到的body就是对象
retrofit.create(MyConverterService.class).getHeaderByResponse().subscribeOn(Schedulers.io()).map(new Func1<Response, Session>() {
@Override
public Session call(Response response) {
Log.e("----------->", "code" + response.code());
Log.e("----------->", "heade" + response.headers());
Log.e("----------->", "body" + response.body());

return new Gson().fromJson(response.body().toString(), Session.class);
}
}).observeOn(AndroidSchedulers.mainThread()).subscribe(new Observer<Session>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {

}

@Override
public void onNext(Session session) {
Log.e("-------------->", "getResponse  ---session" + session.getData().getSession());
}
});
}

/**
*使用Request获取头和请求码
*/
private void getResult() {

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://www.xxx.com/api/rest/")
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();

//添加了Gson转换器,返回类型也对应的写为Result<Session> 所以body为对象
retrofit.create(MyConverterService.class).getHeaderByResult()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Result>() {
@Override
public void onCompleted() {

}

@Override
public void onError(Throwable e) {

}

@Override
public void onNext(Result result) {
Log.e("----------->", " result code" + result.response().code());
Log.e("----------->", "resultheade" + result.response().headers());
Log.e("----------->", "resultbody" + result.response().body());

}
});
}


5、下载图片

1)定义接口

/**
* 可以从ResponseBody中得到InputStream
* @return
*/
@Streaming
@GET("5aV1bjqh_Q23odCf/static/superman/img/logo/bd_logo1_31bdc765.png")
Observable<ResponseBody> downBitmap();


2)调用

/**
* 下载图片
*/
private void downBitmap(){

Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://ss0.bdstatic.com/")
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();

retrofit.create(MyConverterService.class).downBitmap()
.subscribeOn(Schedulers.io())
.map(new Func1<ResponseBody, Bitmap>() {
@Override
public Bitmap call(ResponseBody responseBody) {

return BitmapFactory.decodeStream(responseBody.byteStream());
}
})
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Observer<Bitmap>() {
@Override
public void onCompleted() {
Log.e("---------->","onCompleted");
}

@Override
public void onError(Throwable e) {
Log.e("---------->","onError"+e.toString());
}

@Override
public void onNext(final Bitmap bitmap) {

ImageView imageView = new ImageView(RetrofitConverterActivity.this);
imageView.setLayoutParams(new LinearLayout.LayoutParams(500,500));
imageView.setImageBitmap(bitmap);
mLinearLayout.addView(imageView);

}
});
}


前三篇的源码,以及本篇的源码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: