今天写了个retrofit结合rxjava的案例,需求是封装retrofit的网络请求部分。结果封装的是一脸血啊!

出现的结果是一直都是log打印“请求失败”,还不报错,就是请求不到数据,让人很是郁闷!

后来经过各种资料的查找,历经4个小时,总结出了这样的一些东西:

首先是依赖的版本:

起初的依赖是这样滴:

/*RxJava与RxAndroid的依赖*/ 不支持接口封装String
    compile 'io.reactivex:rxjava:1.1.0'
    compile 'io.reactivex:rxandroid:1.1.0'
    compile 'com.squareup.retrofit2:retrofit:2.0.0-beta4'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'
    compile 'com.squareup.retrofit2:adapter-rxjava:2.0.0-beta4'

当时坚持用这个的依赖的原因是秉承“Retrofit2.0的几个包的版本必须相同”的原则,就没想着换,也没考虑到会是依赖的原因,

后来一查知道是这个版本的依赖在进行retrofit与rxjava的结合时,还没有“RxJava2CallAdapterFactory.create()”,

但是绝不能说这个依赖是错误的,切记!因为它在某些地方还是有可取的价值的!

所以只能是更换依赖:

/*RxJava与RxAndroid的依赖*/  支持接口封装String
    compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
    compile 'io.reactivex.rxjava2:rxjava:2.1.0'
   /*Retrofit与RxAndroid配置依赖*/
    compile 'com.squareup.retrofit2:retrofit:2.3.0'
    compile 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'
    /*使Retrofit的转化器自定义完成数据的转化
    * 就是我们可以接口中少写一些bean类
    * */
    compile 'com.squareup.retrofit2:converter-scalars:+'
    /*gson解析*/
    compile 'com.google.code.gson:gson:2.8.1'
    compile 'com.squareup.retrofit2:converter-gson:2.0.0-beta4'

到这里,问题就解决的差不多了,然后直接引入Java封装的思想就行:

代码走一波:

封装类:

package bw.com.dierzhou.utils;

import android.util.Log;

import java.util.concurrent.TimeUnit;

import bw.com.dierzhou.interfaces.JieKou;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Consumer;
import io.reactivex.schedulers.Schedulers;
import okhttp3.OkHttpClient;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.scalars.ScalarsConverterFactory;

/**
 * Created by mypc on 2018/1/5.
 *
 * http://www.yulin520.com/
 */

public class RetrofitFacety {

    /**
     *
     * @param file 设置数据缓存的路径
     * @param url  接口路劲
     * @param mvpJieKou  回调数据的接口
     */


    //使全局就一个OKHttpClient对象
    public static OkHttpClient okHttpClient = new OkHttpClient.Builder()
//            .cookieJar(new CookiesManager())
            .connectTimeout(20, TimeUnit.SECONDS)
            .readTimeout(20, TimeUnit.SECONDS)
            .writeTimeout(20, TimeUnit.SECONDS)
//            .addInterceptor(new LoggingInterceptor())
            .build();
    //使全局就一个Retrofit对象,设置基础Url
    public static JieKou apiService = new Retrofit.Builder()
            .baseUrl("http://qbh.2dyt.com")
            //使我们能高度自定义转化器
            .addConverterFactory(ScalarsConverterFactory.create())
            .client(okHttpClient)
            //把 以前的 call 转化成 Observable,这是RetrofitRxJava结合使用的关键
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())

            .build().create(JieKou.class);


    public static Observable<String> get(String file,String url) {
        return apiService.getJieKouContent(url)
                .doOnNext(new Consumer<String>() {
                    @Override
                    public void accept(@NonNull String s) throws Exception {
                        Log.i("jiba","这是处理缓存本地操作");
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread());
    }

}
既然要封装,我们就要封装的彻底一点,将rxjava的回调结果也封装一下,也就是观察者封装!
代码:

package bw.com.dierzhou.utils;


import android.util.Log;

import io.reactivex.Observer;
import io.reactivex.annotations.NonNull;
import io.reactivex.disposables.Disposable;

/**
 * Created by mypc on 2018/1/6.
 *
 * 父类的公有方法的抽取,,抽象的思想
 */

public abstract class BaseServer implements Observer<String> {

    public abstract void onSuccess(String myBean);
    public abstract void onErroy(String ss);

    @Override
    public void onError(Throwable e) {
        onErroy("请求失败");
        Log.i("jiba","===="+e);
    }

    @Override
    public void onNext(String myBean) {
        onSuccess(myBean);
    }

    @Override
    public void onSubscribe(@NonNull Disposable d) {

    }

    @Override
    public void onComplete() {

    }
}


apiserver注解接口代码:

package bw.com.dierzhou.interfaces;

import io.reactivex.Observable;
import retrofit2.http.GET;
import retrofit2.http.Url;

/**
 * Created by mypc on 2018/1/6.
 */

public interface JieKou {

    //被观察者
    @GET
    Observable<String> getJieKouContent(@Url String url);
}
效果:

Retrofit+RXJava的结合使用与封装

相关文章:

猜你喜欢
相关资源
相似解决方案