rxandroid结合retrofit2发送post请求

来源:互联网 发布:angular js scope 编辑:程序博客网 时间:2024/06/01 08:06

近日retrofit2正式版发布,终于可以愉快的使用retrofit2了。retrofit2是一个android http通讯框架,内部集成了okhttp。RxJava是一个异步执行框架,采用的是发布订阅模式。使用起来可以让代码更简洁。本文将介绍retrofit2 post的使用方法和集成RxAndroid的retrofit2 post方式的使用。

具体原理不多说,下面讲下使用流程吧。


1.配置gradle

    //retrofit2相关依赖    compile 'com.squareup.retrofit2:retrofit:2.0.0'    compile 'com.squareup.okhttp3:logging-interceptor:3.1.2'    compile 'com.squareup.retrofit2:converter-gson:2.0.0'    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0'    //rxandroid相关依赖    compile 'io.reactivex:rxandroid:1.1.0'    compile 'io.reactivex:rxjava:1.1.0'

2.定义请求的service接口,举个例子

public interface RestApi {    @FormUrlEncoded    @POST("User/login")    Call<BaseBean> login(@Field("mobile") String mobile, @Field("password") String password);}

3.发送网络请求,用异步方式,可直接在主线程调用


private void sendPost() {        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);        OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor).build();        Retrofit retrofit = new Retrofit.Builder().client(okHttpClient).baseUrl("http://baidu.test/Api/")                .addConverterFactory(GsonConverterFactory.create())                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())                .build();        RestApi restApi = retrofit.create(RestApi.class);        Call<BaseBean> callBack = restApi.login("13812345678", "11111");        callBack.enqueue(new Callback<BaseBean>() {            @Override            public void onResponse(Call<BaseBean> call, Response<BaseBean> response) {                try {                    Log.d("onResponse ", response.body().getMessage());                } catch (Exception e) {                    e.printStackTrace();                }            }            @Override            public void onFailure(Call<BaseBean> call, Throwable t) {                Log.d("onFailure ", "onFailure");            }        });    }


这样,一个简易的使用retrofit2发送网络请求就完成了。

4.下面结合RxAndroid调用retrofit2。当retrofit2还带beta版本的时候,与RxAndroid结合使用似乎有些问题,RxJavaCallAdapterFactory实现的是retrofit老版的CallAdapter.Factory,所以不能使用。retrofit2的正式版已经没这个问题了。

首先还是定义一个service接口,与上面的不同,这个返回的是个Observable。

public interface RxApi {    @FormUrlEncoded    @POST("User/login")    Observable<BaseBean> login(@Field("mobile") String mobile, @Field("ccid") String ccid, @Field("password") String password);}
       用Rx的方式调用接口

    private void rxRetrofit() {        HttpLoggingInterceptor httpLoggingInterceptor = new HttpLoggingInterceptor();        httpLoggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);        OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(httpLoggingInterceptor).build();        Retrofit retrofit = new Retrofit.Builder().client(okHttpClient).baseUrl("http://baidu.test/Api/")                .addConverterFactory(GsonConverterFactory.create())                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())                .build();        RxApi restApi = retrofit.create(RxApi.class);        Observable<BaseBean> observable = restApi.login("13812345678", "11111");        observable.observeOn(AndroidSchedulers.mainThread())                .subscribeOn(Schedulers.io())                .subscribe(new Observer<BaseBean>() {                    @Override                    public void onCompleted() {                        Log.d("onCompleted", "****************");                    }                    @Override                    public void onError(Throwable e) {                        e.printStackTrace();                        Log.d("onError", "****************" + e.getMessage());                    }                    @Override                    public void onNext(BaseBean baseBean) {                        Log.d("onNext", "****************");                                            }                });    }
     
单独使用retrofit2和结合Rx使用的方法就讲完了。想详细了解Retrofit2和RxAndroid的可以参考下面两篇文章。
Retrofit 2.0:有史以来最大的改进
 给 Android 开发者的 RxJava 详解
                                             
2 1