编程

当前位置:澳门新莆京娱乐官网 > 编程 > 聊聊对RxJava与Retrofit的封装【新萄京娱乐场x606com】

聊聊对RxJava与Retrofit的封装【新萄京娱乐场x606com】

来源:http://www.drgigabytes.com 作者:澳门新莆京娱乐官网 时间:2020-03-01 22:48

逻辑依旧挺清晰的,然而呢,假诺老是使用都令你去写那样多的代码肯定会以为很单调,并且这里作者还尚未对回到结果做错误管理,于是大家就应当思考一下对代码封装一下了。

GankService gankService = ServiceFactory.getInstance().createService(GankService.class);

当下HighlanderxJava和Retrofit结合使用已是可怜分布了,英特网关于那上头的小说也是不可胜举,其实大约的思虑都以大半的,后天本身也来写一篇有关索罗德xJava与Retrofit的稿子,聊一聊关于HighlanderxJava与Retrofit的包裹,尽大概的能让其适用于半数以上类型,以供我们在上学那地方的时候多一份参谋。

闲聊非常少说了,直接上前天的核心。大家先来探访关于ENVISIONxJava和Retrofit最大旨的施用是怎样的

/** * Created by _SOLID * Date:2016/7/27 * Time:15:23 */public class ServiceFactory { private final Gson mGsonDateFormat; private ServiceFactory() { mGsonDateFormat = new GsonBuilder() .setDateFormat("yyyy-MM-dd hh:mm:ss") .create(); } private static class SingletonHolder { private static final ServiceFactory INSTANCE = new ServiceFactory(); } public static ServiceFactory getInstance() { return SingletonHolder.INSTANCE; } /** * create a service * * @param serviceClass * @param <S> * @return */ public <S> S createService(Class<S> serviceClass) { String baseUrl = ""; try { Field field1 = serviceClass.getField("BASE_URL"); baseUrl =  field1.get(serviceClass); } catch (NoSuchFieldException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.getMessage(); e.printStackTrace(); } Retrofit retrofit = new Retrofit.Builder() .baseUrl .client(getOkHttpClient .addConverterFactory(GsonConverterFactory.create(mGsonDateFormat)) .addCallAdapterFactory(RxJavaCallAdapterFactory.create .build(); return retrofit.create(serviceClass); } private final static long DEFAULT_TIMEOUT = 10; private OkHttpClient getOkHttpClient() { //定制OkHttp OkHttpClient.Builder httpClientBuilder = new OkHttpClient.Builder(); //设置超时时间 httpClientBuilder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS); httpClientBuilder.writeTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS); httpClientBuilder.readTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS); //设置缓存 File httpCacheDirectory = new File(FileUtils.getCacheDir(SolidApplication.getInstance, "OkHttpCache"); httpClientBuilder.cache(new Cache(httpCacheDirectory, 10 * 1024 * 1024)); return httpClientBuilder.build(); }}

是或不是一差二错感到到创立三个Service的代码一下简短了许多。这里还未有完,大家只是废除了Service的创制,还尚未对结果去做拍卖。

参谋资料能够去本身保管的专项论题查看:TiguanxJava体系专项论题(Android方向)

实际上便是把参数的解说换来@Url就足以了,关于得以完结的细节能够参照文末给出的源码。

率先我们须求去定义三个对接待口的Service和再次回到结果的实体类

public abstract class HttpResultSubscriber<T> extends Subscriber<HttpResult<T>> { @Override public void onCompleted() { } @Override public void onError(Throwable e) { Logger.e(this,e.getMessage; e.printStackTrace(); //在这里做全局的错误处理 if (e instanceof HttpException) { // ToastUtils.getInstance().showToast(e.getMessage; } _onError; } @Override public void onNext(HttpResult<T> t) { if  onSuccess(t.results); else _onError(new Throwable("error=" + t.error)); } public abstract void onSuccess; public abstract void _onError(Throwable e);}

就此那边本身定义了如此的二个泛型类(T 是回到结果results的连串)

observeOn(AndroidSchedulers.mainThread.subscribeOn(Schedulers.io

在管理结果的时候,其实顾客只关切的是T,对别的数据能够统一管理下就譬如此处的error字段,有了这些大家就能够再封装一下Subscriber了。

不过相应从何地入手呢,这里大致解析下:

public class HttpResult<T> { public boolean error; public T results;}
Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://gank.io/api/") .addConverterFactory(GsonConverterFactory.create .addCallAdapterFactory(RxJavaCallAdapterFactory.create .build();
public class GankResultBean { private boolean error; private List<ResultsBean> results; ...省略部分代码...} public interface RxGankService { @GET("data/all/20/{page}") Observable<GankResultBean> getAndroidData(@Path int page); }

到此处对于CRUISERxJava与Retrofit的包裹的核心封装就相当多了,也能适用于超过一半的连串中去了,经常景色下改改HttpResult和HttpResultSubscriber那五个类就足以了。但是事实上支出中有望会蒙受那样的一种情状:直接去访谈叁个全部的Url,还应该有用Retrofit去做下载该怎么办吧?

public class TransformUtils { public static <T> Observable.Transformer<T, T> defaultSchedulers() { return new Observable.Transformer<T, T>() { @Override public Observable<T> call(Observable<T> tObservable) { return tObservable.observeOn(AndroidSchedulers.mainThread.subscribeOn(Schedulers.io; } }; } public static <T> Observable.Transformer<T, T> all_io() { return new Observable.Transformer<T, T>() { @Override public Observable<T> call(Observable<T> tObservable) { return tObservable.observeOn(Schedulers.io.subscribeOn(Schedulers.io; } }; }}
public class RetryWhenNetworkException implements Func1<Observable<? extends Throwable>, Observable<?>> { private int count = 3;//retry count private long delay = 3000;//delay time public RetryWhenNetworkException() { } public RetryWhenNetworkException(int count) { this.count = count; } public RetryWhenNetworkException(int count, long delay) { this.count = count; this.delay = delay; } @Override public Observable<?> call(Observable<? extends Throwable> observable) { return observable .zipWith(Observable.range(1, count + 1), new Func2<Throwable, Integer, Wrapper>() { @Override public Wrapper call(Throwable throwable, Integer integer) { return new Wrapper(throwable, integer); } }).flatMap(new Func1<Wrapper, Observable<?>>() { @Override public Observable<?> call(Wrapper wrapper) { if ((wrapper.throwable instanceof ConnectException || wrapper.throwable instanceof SocketTimeoutException || wrapper.throwable instanceof TimeoutException) && wrapper.index < count + 1) { return Observable.timer(delay + (wrapper.index - 1) * delay, TimeUnit.MILLISECONDS); } return Observable.error(wrapper.throwable); } }); } private class Wrapper { private int index; private Throwable throwable; public Wrapper(Throwable throwable, int index) { this.index = index; this.throwable = throwable; } }}

把这段代码与篇章开端那段代码比较一下,是还是不是开心了重重,而且这里还做了错误管理的。

跟着再去早先化Retrofit

有关WranglerxJava的底子运用能够参照他事他说加以考查我的另一篇小说:是时候学习WranglerxJava了,至于Retrofit的中坚使用这里本人就不做牵线了,这里可以给大家提供二个读书Retrofit比较全面的网址retrofit-getting-started-and-android-client,对Retrofit还不太熟练的校友能够先去拜访上面包车型大巴种种文章。

{ "error": false, "results": []}

我们来探视以后怎么使用呢:

下一场在应用的时候利用compose操作符就足以了

未来大家应犹怎么着去采纳呢

  • 新萄京娱乐场x606com ,看上边的代码大家会意识Retrofit开首化的这段代码,日常就一个baseUrl会有分歧,别的的基本是同等的,假诺大家每一趟去创设一个Service都要去写那么多重复的代码也大大扩大了冗余度
  • 对于重临的结果平日处境下数据格式是这么的:

这里大家能够创建二个TransformUtils类去管理一下

咱俩都知情对于互联网乞请鲜明会有不成功的事态,有未有一种方案能够管理一下?其实奥迪Q3xJava已经为我们提供了如此的三个操作符<code>RetryWhen</code>能够用来兑现重试机制,笔者那边有贰个实现好的八个体制,默许情形下,最多种试3次,第2回会等3s,第一遍会等6s,第贰次会等9s。

public interface CommonService { String BASE_URL = "http://www.example.com/";//这个不重要,可以随便写,但是必须有 @GET Observable<ResponseBody> loadString(@Url String url); @GET @Streaming Observable<ResponseBody> download(@Url String url);}

任何的代码笔者就不做表明了,这里自个儿只对createService方法做一个简约的证实:对于baseUrl是用反射去赢得大家自定义Service中的BASE_UPRADOL字段,所以在动用的时候就有了二个约定,当大家新建叁个Service的时候必须要有BASE_U君越L字段并赋值。也正是说大家在新建的Service大约是那般的

最后大家就足以去行使了

 RxGankService rxGankService = retrofit.create(RxGankService.class); Observable<GankResultBean> observable = rxGankService.getAndroidData; observable.subscribeOn(Schedulers.io .observeOn(AndroidSchedulers.mainThread .subscribe(new Subscriber<GankResultBean>() { @Override public void onCompleted() { } @Override public void onError(Throwable e) { } @Override public void onNext(GankResultBean gankResultBean) { } });
public interface GankService { String BASE_URL = "http://www.gank.io/api/"; @GET("data/all/20/{page}") Observable<GankResultBean> getAndroidData(@Path int page);}

我以 那么些接口为例:他赶回的结果的格式是这么的:

ServiceFactory.getInstance() .createService(GankService.class) .getAndroidData .observeOn(AndroidSchedulers.mainThread .subscribeOn(Schedulers.io .subscribe(new HttpResultSubscriber<List<GanHuoDataBean>>() { @Override public void onSuccess(List<GanHuoDataBean> list) { } @Override public void _onError(Throwable e) { } });
 { code:1, msg:"your message", data:[] }

通过地点的剖判大家差相当少有了叁个方向,对于Service的创办应该有叁个类去单独管理。所以那边作者创造了三个ServiceFactory的类。

实在建设方案是局地,这里大家得以去定义三个Common瑟维斯

.compose(TransformUtils.<HttpResult<List<GanHuoDataBean>>>defaultSchedulers

细心的同校料定注意到了这段代码,这段代码每便都以在再一次的使用

code是服务器端和顾客端约定好的一种准则,比如1代表数据供给成功,-1意味着央浼战败,-2代表权限不足等等,msg代表提示消息,此中data恐怕是数组对象也说不准是通常的靶子,大家得以设想对回到的结果做四个集结的管理。

本文源码地址:源码

本文由澳门新莆京娱乐官网发布于编程,转载请注明出处:聊聊对RxJava与Retrofit的封装【新萄京娱乐场x606com】

关键词:

上一篇:各种情况下的

下一篇:没有了