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);                    }                });    }

前三篇的源码,以及本篇的源码

原创粉丝点击