rxandroid结合retrofit2发送post请求

近日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 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 callBack = restApi.login("13812345678", "11111");
        callBack.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                try {
                    Log.d("onResponse ", response.body().getMessage());

                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            @Override
            public void onFailure(Call 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 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 observable = restApi.login("13812345678", "11111");

        observable.observeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.io())
                .subscribe(new Observer() {
                    @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 详解
 
 

你可能感兴趣的:(rxandroid结合retrofit2发送post请求)