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中添加依赖
2、定义接口
可以看到吧,Call已经换成了Observable,注意这里的T也就是之前说的ResponseBody也换成了String,所以不要忘了添加转换器的依赖
3、调用
4、获取请求头,和请求码
说明:
注意返回值为:Observable< Response< String >>
1、要想获取请求头和请求码需要用到Response< T >,retrofit2包下的;或者Observable< Result< T>> ,retrofit2.adapter.rxjava包下的;
2、注意不管哪种,T都一定要给相应的类型,否则报错。
1)接口
2)调用
5、下载图片
1)定义接口
2)调用
前三篇的源码,以及本篇的源码
还记得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); } }); }
前三篇的源码,以及本篇的源码
相关文章推荐
- 学会Retrofit+OkHttp+RxAndroid三剑客的使用,让自己紧跟Android潮流的步伐
- 初次使用RxAndroid + Retrofit
- 还不会使用OkHttp和Retrofit进行Android网络请求?看看这篇你就会了!
- Android中Retrofit+OkHttp进行HTTP网络编程的使用指南
- rxjava+rxandroid+retrofit2.0使用方法demo讲解
- Android中Retrofit+OkHttp进行HTTP网络编程的使用指南
- Retrofit与RxAndroid结合使用
- android Retrofit2+okHttp3使用总结
- Retrofit2+Rxjava2 okhttp RxBus 使用记录
- android Retrofit+OkHttp使用自制的证书实现https安全传输
- Android 使用Retrofit2.0 + OKHttp 实现 HTTP协议请求
- Retrofit 2.0使用详解,配合OkHttp、Gson,Android最强网络请求框架
- RxAndroid+RxJava+Gson+retrofit+okhttp初步搭建android网络请求框架
- Android网络请求使用Retrofit+OkHttp,如何获取请求参数 ?
- Android RxJava/RxAndroid结合Retrofit使用
- Rxjava, RxAndroid, Retrofit 等库的使用
- Android Retrofit 2.0(二)使用教程OkHttp3 + Gson + RxJava
- android:retrofit+OKHttp使用
- retrofit 2.0 +RxAndroid 使用中遇到异常 【abstract method not implemented】
- android Retrofit+OkHttp使用自制的证书实现https安全传输