Retrofit2、okHttp3、RxAndroid使用
来源:互联网 发布:淘宝上定制耳机的店铺 编辑:程序博客网 时间:2024/05/19 12:11
前三篇讲了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); } }); }
前三篇的源码,以及本篇的源码
阅读全文
1 0
- Retrofit2、okHttp3、RxAndroid使用
- Retrofit2+okhttp3 使用教程
- Retrofit2+okHttp3使用样例
- Retrofit2+RxAndroid 详解
- rxAndroid+OkHttp+retrofit2三贱客
- Retrofit2.0+RxAndroid
- Rxjava2+retrofit2+rxAndroid+okHttp
- Kotlin入门 + RxAndroid+Retrofit2
- Retrofit2.0+RxAndroid+RxBus
- okhttp3 retrofit2 缓存问题
- Rxjava+Retrofit2+Okhttp3
- 初探Okhttp3+Retrofit2+RXJava
- Retrofit2+OkHttp3+RxJava2
- Rxjava2+okhttp3+Retrofit2封装
- Okhttp3+Rxjava+Retrofit2封装
- Retrofit2初尝试(rxjava + okhttp3)
- Retrofit2.0+okhttp3设置缓存
- Retrofit2.0+okhttp3实现缓存
- Java中的https证书问题
- POJ 3061 Subsequence 尺取法附基础模板
- 云计算是过去式了,接下来是边缘计算的时代?
- JAVASCRIPT 面向对象编程(二)
- Unity解析gif动态图
- Retrofit2、okHttp3、RxAndroid使用
- 编写一个 JAVA 程序,实现输出考试成绩的前三名
- 示波器使用
- 带花树算法 UOJ#79. 一般图最大匹配
- oracle常用命令
- 夜间模式的切换
- 如何使用Movie Studio制作幻灯片?
- mysql在linux下的安装
- TCP协议与UDP协议的区别