Retrofit+RxJava处理网络请求

Retrofit的基本用法在上一节已经介绍过了接下来我们介绍下Retrofit+RxJava的组合使用不了解Retrofit的用法的可以先看看我上篇博客的介绍
Restrofit简单入门
那如果不了解RxJava的我会在后续的课程中对RxJava进行介绍接下来我们就介绍 Retrofit+RxJava的简单应用

1.gradle环境配置

代码如下

    compile 'io.reactivex.rxjava2:rxjava:2.0.0-RC1'//RxJava依赖包
    compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'//Retrofit2所需要的包
    compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'//ConverterFactory的Gson依赖包
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'//CallAdapterFactory的Rx依赖包
    compile 'com.squareup.retrofit2:converter-scalars:2.0.0-beta4'//ConverterFactory的String依赖包

当我们配置完这些后运行项目可能会发生一个错误错误内容如下

Error:Execution failed for task ':app:transformResourcesWithMergeJavaResForDebug'.
> com.android.build.api.transform.TransformException: com.android.builder.packaging.DuplicateFileException: Duplicate files copied in APK META-INF/rxjava.properties
    File1: C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\io.reactivex\rxjava\1.1.0\748f0546d5c3c27f1aef07270ffea0c45f0c42a4\rxjava-1.1.0.jar
    File2: C:\Users\Administrator\.gradle\caches\modules-2\files-2.1\io.reactivex.rxjava2\rxjava\2.0.0-RC1\3ee37bb825446a3bafac68a46f2397a8affd9b68\rxjava-2.0.0-RC1.jar

具体原因我也不是太清楚不过在我们的gradle的android目录下添加如下代码问题就解决了

  packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/rxjava.properties'
        exclude 'META-INF/rxjava.PROPERTIES'
        exclude 'META-INF/RXJAVA.properties'
        exclude 'META-INF/RXJAVA.PROPERTIES'
        exclude 'META-INF/rxjava'
        exclude 'META-INF/RXJAVA'
    }

环境配置完成了接下来我们要做的是网络请求处理的那一套流程了

2.首先我们要有网络请求定义的接口跟方法

public interface HttpService {
        @POST("aaaa.do")
        @FormUrlEncoded
        Call<String> getString(@Field("currentVersion") String curVersion,
                               @Field("checkVersion") String checkVersion,
                               @Field("loginName") String loginName,
                               @Field("userName") String userName,
                               @Field("farmName") String farmName,
                               @Field("fw.excute.event") String eventId);

        @POST("1009.do")
        @FormUrlEncoded
        Observable<String> getAllVedioBy(@Field("currentVersion") String curVersion,
                                         @Field("checkVersion") String checkVersion,
                                         @Field("loginName") String loginName,
                                         @Field("userName") String userName,
                                         @Field("farmName") String farmName,
                                         @Field("fw.excute.event") String eventId);
    }

大家可以看到上面的getString方法是我们标准的Restrofit的接口定义方法而下面的的定义及处理是我们的RxJava的处理方式最主要的区别就是返回的不再是一个call对象而是一个Observable

3.接下来我们要写基础的网络访问代码

  Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)
                .addConverterFactory(ScalarsConverterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .build();

再接下来处理网络访问

HttpService apiService = retrofit.create(HttpService.class);
Observable<String> observable = apiService.getAllVedioBy("3.3", "4.8", "101111", "15111", "biubiu", "323A3A303A");
      observable.subscribeOn(Schedulers.io())
                .observeOn(Schedulers.immediate())
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {
                        boolean a = false;
                        int ss = 1;
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(String s) {
                        String result = s.toLowerCase();
                    }
                });

创建retrofit 对象的方法跟上一节提到的一样不同的是Observable observable = apiService.getAllVedioBy(…)这一段代码
其实原理很简单restrofit将处理完的网络请求不再通过自己的call对象获取了而是交给了Observable这样的话Observable就持有了网络请求的结果。
再看下面的内容 observable.subscribeOn(Schedulers.io()).observeOn(Schedulers.immediate())这段话的意思是让我们的观察者在主线程也就是immediate这个线程而subscribeOn代表是被观察者它的执行放在了io线程也就是单起个线程防止主线程卡死
.subscribe()意思是订阅的意思观察者订阅被观察者
new Subscriber() 这个相当于执行后的结果的回调接口用于处理上面一系列流程处理的结果

经历上面的过程我们的restrofit+rxjava的基本内容就处理完了但是回过头来想想还有没有可以改变的地方大多数app都是接收到的后台数据为json数据要呈现在界面上一般需要将json转换成对象然后通过对象获取内容呈现在界面上那我们做如下修改这里只处理结果内容

HttpService apiService = retrofit.create(HttpService.class);
Observable<String> observable = apiService.getAllVedioBy("3.3", "4.8", "101111", "15111", "biubiu", "323A3A303A");
      observable.subscribeOn(Schedulers.io())
                .observeOn(Schedulers.immediate())
                .map(new Func1<String, GetVersionResult>() {
                    @Override
                    public GetVersionResult call(String s) {
                        Gson gson = new Gson();
                        return gson.fromJson(s, GetVersionResult.class);
                    }
                })
                .subscribe(new Subscriber<GetVersionResult>() {
                    @Override
                    public void onCompleted() {
                        boolean a = false;
                        int ss = 1;
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(GetVersionResult errorString) {
                        String result = errorString.getReturn_sts();
                    }
                });

我们通过 .map将返回的结果集处理成了GetVersionResult 内容这样我们下面的处理也就跟着Map的转化转换成了接收GetVersionResult参数的方法了。
最后借鸿洋大神的处理截图看看大神是如何处理的

代码截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值