RxJava2 - 重复任务的间隔&在有条件的情况下运行一个observable

时间:2017-06-12 02:51:10

标签: android retrofit rx-java rx-java2

改装运行

这是我的界面:

lgb_train = lgb.Dataset(X_train, y_train)
lgb_eval = lgb.Dataset(X_test, y_test, reference=lgb_train)
params = {
'task':'train',
'boosting':'gbdt',
'objective':'binary',
'metric':{'l2', 'auc'},
'num_leaves': 62,
'learning_rate': 0.05,
'feature_fraction': 0.9,
'bagging_fraction': 0.8,
'bagging_freq': 5,
'verbose': 20
}
gbm = lgb.train(params,
lgb_train,
num_boost_round=250,
valid_sets=lgb_eval)

print('Start predicting...')

y_pred = gbm.predict(X_test, num_iteration=gbm.best_iteration)
y_pred = np.round(y_pred)

print gbm.feature_importance()

这是我运行它的地方:

  @GET("solicitation/all")
  Observable<SolicitationResponse> getAll(@Query("X-Authorization") String apiKey);

所以,有两个问题:

1)如果我们有互联网连接,如何才能添加条件?

这不起作用:

    apiService.getAll(getResources().getString(R.string.api_key))
            .subscribeOn(Schedulers.io())
            .flatMapIterable(SolicitationResponse::getData)
            .observeOn(AndroidSchedulers.mainThread())
            .delay(5L, java.util.concurrent.TimeUnit.SECONDS) // THIS DOESN'T WORK LIKE I WANT IT TO..
            .repeat()
            .subscribe(s -> Log.e(TAG, "data: " + s.getName()));

为什么呢?因为条件代码不会无休止地运行,这意味着它只会检查我们是否有一次互联网连接,如果我们失去它就会崩溃。

在运行getAll方法之前有没有办法添加条件?

2)我需要在任务之前或之后添加一个间隔,通过插入if (NetworkUtils.isConnected()) { //observable above here } 它会延迟订阅,这不是我想要或需要的。如何在这种特殊情况下完成它?

1 个答案:

答案 0 :(得分:1)

这是一个建议:

Observable.fromCallable(() -> NetworkUtils.isConnected())
            .flatMap(isConnected -> {
                if (isConnected) {
                    return apiService.getAll(getResources().getString(R.string.api_key))
                            .subscribeOn(Schedulers.io())
                            .flatMapIterable(SolicitationResponse::getData);
                } else {
                    return Observable.empty();
                }
            })
            .subscribeOn(Schedulers.io())
            .observeOn(Schedulers.immediate())
            .repeatWhen(observable -> observable.delay(5, TimeUnit.SECONDS))
            .subscribe(s -> Log.e(TAG, "data: " + s.getName()));

1)最直接的方法是将网络检查添加到流中,并使用flatMap()有条件地决定要做什么。

2)在使用具有所需值的delaySubscription()之前添加延迟之前,但是第一次也会发生延迟,所以在这里添加延迟的第二种方法似乎更合适,并且可以使用repeatWhen()

完成