今天写了个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,这是Retrofit与RxJava结合使用的关键 .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); }效果: