美文网首页
RxJava实际应用--->(有条件)网络请求轮询

RxJava实际应用--->(有条件)网络请求轮询

作者: 谢尔顿 | 来源:发表于2018-07-03 09:51 被阅读15次

1.需求场景

客户端隔固定时间主动向服务器发送请求获取信息,可根据服务器返回信息停止轮询,我们可以利用操作符repeatWhen()实现。

2.具体实现

只展示一些重要的实现代码:

        Retrofit retrofit = new Retrofit.Builder().baseUrl("http://fy.iciba.com/")
                .addConverterFactory(GsonConverterFactory.create())
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();
        RequestApi requestApi = retrofit.create(RequestApi.class);
        Observable<TranslationBean> observable = requestApi.getCall();
        observable.repeatWhen(new Function<Observable<Object>, ObservableSource<?>>() {
            //在Function函数中,必须对输入的Observable<Objuect>进行处理,此处使用flatMap操作符接收上游的数据
            //此处决定是否重新订阅 & 发送原来的Observable,即轮询
            //此处有2种情况:
            //1.若返回1个Complete()/Error()事件,则不重新订阅&发送原来的Observable,即轮询结束
            //2.若返回其余事件,则重新订阅 & 发送原来的Observable,则继续轮询
            @Override
            public ObservableSource<?> apply(Observable<Object> objectObservable) throws Exception {
                return objectObservable.flatMap(new Function<Object, ObservableSource<?>>() {
                    @Override
                    public ObservableSource<?> apply(Object o) throws Exception {
                        //如果轮询次数等于5之后,则停止轮询
                        if (i > 3)
                            return Observable.error(new Throwable("轮询结束"));
                        //如果轮询数据小于5,则发送next事件以继续轮询
                        return Observable.just(1).delay(2, TimeUnit.SECONDS);
                    }
                });
            }
        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<TranslationBean>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(TranslationBean value) {
                        //接收服务器返回的数据
                        Log.d(Constant.TAG, value.getContent().getOut());
                        i++;

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.e(Constant.TAG, e.toString());
                    }

                    @Override
                    public void onComplete() {

                    }
                });

3. 测试结果

有条件轮询

相关文章

网友评论

      本文标题:RxJava实际应用--->(有条件)网络请求轮询

      本文链接:https://www.haomeiwen.com/subject/muqluftx.html