Rxjava2在Android中的模版栗子

Android切换UI线程

        Observable.create(new ObservableOnSubscribe<Boolean>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Boolean> emitter) throws Exception {
                try {
               //TODO   dosomething
             
                    emitter.onNext(true);
                } catch (Exception e) {
                    e.printStackTrace();
                    emitter.onComplete();
                }
            }

        }).subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Boolean>() {

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

                    }

                    @Override
                    public void onError(@NonNull Throwable e) {
                        e.printStackTrace();


                    }

                    @Override
                    public void onComplete() {


                    }


                    @Override
                    public void onNext(@NonNull Boolean aBoolean) {
                        if (aBoolean) {
                        //TODO   dosomething
                        } else {
                        }
                    }
                });

//或者可以这样
     Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
                      //TODO   dosomething
            }
        }).compose(RxUtil.<String>io_main()).subscribe(new Consumer<String>() {
            @Override
            public void accept(@NonNull String s) throws Exception {

            }
        });



/**
 * <p>描述:线程调度工具</p>
 * 作者: zhouyou<br>
 * 日期: 2017/5/15 17:12 <br>
 * 版本: v1.0<br>
 */
public class RxUtil {

    public static <T> ObservableTransformer<T, T> io_main() {
        return new ObservableTransformer<T, T>() {
            @Override
            public ObservableSource<T> apply(@NonNull Observable<T> upstream) {
                return upstream
                        .subscribeOn(Schedulers.io())
                        .unsubscribeOn(Schedulers.io())
                        .doOnSubscribe(new Consumer<Disposable>() {
                            @Override
                            public void accept(@NonNull Disposable disposable) throws Exception {
                                HttpLog.i("+++doOnSubscribe+++" + disposable.isDisposed());
                            }
                        })
                        .doFinally(new Action() {
                            @Override
                            public void run() throws Exception {
                                HttpLog.i("+++doFinally+++");
                            }
                        })
                        .observeOn(AndroidSchedulers.mainThread());
            }
        };
    }

    public static <T> ObservableTransformer<ApiResult<T>, T> _io_main() {
        return new ObservableTransformer<ApiResult<T>, T>() {
            @Override
            public ObservableSource<T> apply(@NonNull Observable<ApiResult<T>> upstream) {
                return upstream
                        .subscribeOn(Schedulers.io())
                        .unsubscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .map(new HandleFuc<T>())
                        .doOnSubscribe(new Consumer<Disposable>() {
                            @Override
                            public void accept(@NonNull Disposable disposable) throws Exception {
                                HttpLog.i("+++doOnSubscribe+++" + disposable.isDisposed());
                            }
                        })
                        .doFinally(new Action() {
                            @Override
                            public void run() throws Exception {
                                HttpLog.i("+++doFinally+++");
                            }
                        })
                        .onErrorResumeNext(new HttpResponseFunc<T>());
            }
        };
    }


    public static <T> ObservableTransformer<ApiResult<T>, T> _main() {
        return new ObservableTransformer<ApiResult<T>, T>() {
            @Override
            public ObservableSource<T> apply(@NonNull Observable<ApiResult<T>> upstream) {
                return upstream
                        //.observeOn(AndroidSchedulers.mainThread())
                        .map(new HandleFuc<T>())
                        .doOnSubscribe(new Consumer<Disposable>() {
                            @Override
                            public void accept(@NonNull Disposable disposable) throws Exception {
                                HttpLog.i("+++doOnSubscribe+++" + disposable.isDisposed());
                            }
                        })
                        .doFinally(new Action() {
                            @Override
                            public void run() throws Exception {
                                HttpLog.i("+++doFinally+++");
                            }
                        })
                        .onErrorResumeNext(new HttpResponseFunc<T>());
            }
        };
    }

延时执行

    private CompositeDisposable compositeDisposable; 

  public void addDisposable(Disposable disposable) {
        if (compositeDisposable == null) {
            compositeDisposable = new CompositeDisposable();
        }
        compositeDisposable.add(disposable);
    }

    public void dispose() {
        if (compositeDisposable != null && !compositeDisposable.isDisposed()) {
            compositeDisposable.dispose();
        }

    }
    ```
//防止过快点击
  addDisposable(RxView.clicks(right_text_ll)
            .throttleFirst(500, TimeUnit.MILLISECONDS)
            .subscribe(o -> {
                if (isSloting) {
                    slotingMsg();
                    return;
                }
                startActivity(new Intent(SlotMachineActivity.this, SlotRecordActivity.class));
            }));

 //延迟2秒钟
    addDisposable(Observable
            .just(1)
            .delay(2, TimeUnit.SECONDS)  //延迟2秒钟,然后在发射数据
            .subscribeOn(Schedulers.newThread())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<Integer>() {
                @Override
                public void accept(Integer integer) throws Exception {
                    startActivity(new Intent(cnt, MonopolyActivity.class));
                    finish();
                }
            }));

定时任务

//定时2秒调用一次

disposable = Flowable.interval(5, TimeUnit.SECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Consumer<Long>() {
                @Override
                public void accept(Long aLong) throws Exception {
                                Log.e("------>",(aLong++)+"");
                }
            });

    addDisposable(disposable);

输出日志:

09-22 03:13:36.785 4434-4434/jy.com.rxjava2 E/------>: 0
09-22 03:13:38.785 4434-4434/jy.com.rxjava2 E/------>: 1
09-22 03:13:40.785 4434-4434/jy.com.rxjava2 E/------>: 2
09-22 03:13:42.785 4434-4434/jy.com.rxjava2 E/------>: 3
09-22 03:13:44.785 4434-4434/jy.com.rxjava2 E/------>: 4
09-22 03:13:46.785 4434-4434/jy.com.rxjava2 E/------>: 5

带有延迟 的定时任务;如下,先 延迟 10秒 ,在执行2s定时任务

public static void interval2(final TextView textView) {
Log.e(">", “start”);
Flowable.interval(10, 2, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer() {
@Override
public void accept(@NonNull Long aLong) throws Exception {
Log.e("
>",(aLong++)+"");
}
});
}

输出日志:

09-22 05:00:32.965 11640-11640/jy.com.rxjava2 E/>: start
09-22 05:00:43.015 11640-11640/jy.com.rxjava2 E/
>: 0
09-22 05:00:45.015 11640-11640/jy.com.rxjava2 E/>: 1
09-22 05:00:47.015 11640-11640/jy.com.rxjava2 E/
>: 2
09-22 05:00:49.015 11640-11640/jy.com.rxjava2 E/>: 3
09-22 05:00:51.015 11640-11640/jy.com.rxjava2 E/
>: 4
09-22 05:00:53.015 11640-11640/jy.com.rxjava2 E/======>: 5



倒计时

    //从0开始发射60个数字为:0-60依次输出,延时0s执行,每1s发射一次。
    mDisposable = Flowable.intervalRange(1, 60, 0, 1, TimeUnit.SECONDS)
            .observeOn(AndroidSchedulers.mainThread())
            .doOnNext(new Consumer<Long>() {
                @Override
                public void accept(Long aLong) throws Exception {
                    String text = MAX_COUNT - aLong + "s";
                    sendCodeText.setText(text);
                    sendCodeText.setTextColor(getResources().getColor(R.color.gray_low));
                }
            })
            .doOnComplete(new Action() {
                @Override
                public void run() throws Exception {
                    //倒计时完毕置为可点击状态
                    sendCode.setEnabled(true);
                    sendCode.setBackground(getResources().getDrawable(R.drawable.shape_phone_text_select));
                    sendCodeText.setText(getString(R.string.string_phone_verification_resend));
                    sendCodeText.setTextColor(getResources().getColor(R.color.yellow_end));

                }
            })
            .subscribe();


}

@Override
protected void onDestroy() {
    super.onDestroy();
    if (mDisposable != null) {
        mDisposable.dispose();
    }
}

flatMap
应用场景:一个接口调用时依赖另一个接口的返回值,如一个接口调用成功后才调用第二个接口或者第二个接口需要第一个接口的返回值作为参数调用


 ServerApi.getEosChainInfo(params.activity)
     .flatMap(new Function<Response<EosChainInfoModel>, Observable<String>>() {
                @Override
                public Observable<String> apply(Response<EosChainInfoModel> response) throws Exception {
                    if (response.isCode() && response.getData() != null) {
                        return signMessage(response.getData(), params);
                    } else {
                        if (!TextUtils.isEmpty(response.getMsg())) {
                            ToastUtils.show(response.getMsg());
                        }
                        return Observable.empty();
                    }

                }
     }).flatMap(new Function<String, Observable<Response<EosTxInfo>>>() {
        @Override
        public Observable<Response<EosTxInfo>> apply(String packJson) throws Exception {
            if (packJson == null) {
                return Observable.empty();
            } else {
                return ServerApi.pushTransaction(params.activity, packJson);
            }
        }
    }).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<Response<EosTxInfo>>() {
                @Override
                public void onSubscribe(@NonNull Disposable d) {
                   params.ui.showProgress("","");
                }

                @Override
                public void onNext(@NonNull Response<EosTxInfo> response) {
                    if (response.isCode() && response.getData() != null) {

                      //TODO  Do something

                    } else {
                        String msg = response.getMsg();
                        if (TextUtils.isEmpty(msg)) {
                            msg = params.activity.getString(R.string.setting_get_eos_node_erro);
                        }
                        if (params.ui.isActive())

                            DialogController.getInstance().showErrorDialog(params.activity,     params.activity.getString(R.string.string_eos_transfer_push_fail), msg);
                    }

                    params.wipe();


                }


                @Override
                public void onError(@NonNull Throwable e) {
                    e.printStackTrace();
                    params.ui.dismissProgress();


                }

                @Override
                public void onComplete() {
                    params.ui.dismissProgress();

                }
            });


}

//签名后返回签名String
private Observable signMessage(EosChainInfoModel infoModel, EosTransferParams params) {
return Observable.just(1)
.map(i -> {
String pockJson = null;
try {
if (params.tx_form == 1) {
pockJson = signTransferMessage(infoModel, params);
} else if (params.tx_form == 2) {
pockJson = createAccountAndSign(infoModel, params);
} else if (params.tx_form == 3) {
pockJson = doSign(infoModel, params);
}
} catch (Exception e) {
e.printStackTrace();
}
return pockJson;
});
}

flatMap栗子2

ServerApi.getInstance().getSlotCount(getContext())
.flatMap(new Function<MonResponse<List>, Observable<MonResponse>>() {
@Override
public Observable<MonResponse> apply(MonResponse<List> response) throws Exception {
if (CommonParametersUtils.checkMonResponse(getContext(), response)) {
slotCountList = response.getData();
if (response == null || slotCountList == null || slotCountList.size() == 0) {
slotMaxCount = 0;
isCanSlot = false;
return Observable.empty();
}
isCanSlot = true;
slotMaxCount = slotCountList.size();
landcode = slotCountList.get(0).getLandCode();
zoneId = slotCountList.get(0).getZoneId();
try {
if (!mediaPlayer.isPlaying() && isCanPlay) {
mediaPlayer.start();
}
} catch (Exception e) {

                        }
                        spin.setEnabled(false);
                        spin.setImageResource(R.mipmap.icon_slot_pin_select_cn);
                        interval();

                        return ServerApi.getInstance().startSlot(getContext(), landcode, zoneId);
                    } else {
                        slotMaxCount = 0;
                        isCanSlot = false;
                        if (!TextUtils.isEmpty(response.getMsg())) {
                            ToastUtils.show(response.getMsg());
                        }
                        return Observable.empty();
                    }

                }
            }).flatMap(new Function<MonResponse<String>, Observable<MonResponse<SlotResultModel>>>() {
        @Override
        public Observable<MonResponse<SlotResultModel>> apply(MonResponse<String> response) throws Exception {
            if (!CommonParametersUtils.checkMonResponse(cnt, response)) {
                isSlotFail = true;
                return Observable.empty();
            } else {
                return ServerApi.getInstance().getSlotCode(getContext(), landcode, zoneId);
            }
        }
    }).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new BaseSubscriber<MonResponse<SlotResultModel>>() {
                @Override
                public void onSubscribe(@NonNull Disposable d) {
                    LogUtil.d("wds", "onSubscribe");
                    addDisposable(d);
                }

                @Override
                public void onNext(@NonNull MonResponse<SlotResultModel> response) {
                    try {
                        if (CommonParametersUtils.checkMonResponse(cnt, response) || response.getData() == null) {
                            int a, b, c;
                            slotResultModel = response.getData();
                            SlotResultModel.MapBean slotList = response.getData().getMap();
                            a = findCode(slotList.getSlotA());
                            b = findCode(slotList.getSlotB());
                            c = findCode(slotList.getSlotC());

                            doneScrool(a, b, c, false);
                        } else {
                            scroolError();
                            slotFail();
                        }


                    } catch (Exception e) {
                        scroolError();
                        slotFail();

                    }

                }


                @Override
                public void onError(ApiException e) {
                    e.printStackTrace();
                    scroolError();
                    XToastUtils.showRoundRectToast(e.getMessage());
                    LogUtil.d("wds", "onError");
                }

                @Override
                public void onComplete() {
                    LogUtil.d("wds", "onComplete");
                    if (!isCanSlot) {
                        if (SP.get(Constant.MON_HASE_BEEN_BUY, false)) {
                            XToastUtils.showRoundRectToast(getString(R.string.string_monopoly_slot_msg2));
                        } else {
                            XToastUtils.showRoundRectToast(getString(R.string.string_monopoly_slot_msg1));

                        }

                        doneScrool(0, 1, 2, true);
                    }
                    if (isSlotFail) {
                        slotFail();
                        scroolError();
                        isSloting = false;
                    }
                    isSlotFail = false;
                }
            });

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值