Retrofit2、okHttp3、RxAndroid使用

前三篇讲了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);

                    }
                });
    }

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

猜你喜欢

转载自blog.csdn.net/hello_1s/article/details/76682394