使用 RxJava 上传解析对象

Upload Parse Object with RxJava

我想将 parse.com 主要是 ParseObject.save() 的同步方法包装到 RxJava 包装器中。我想出了以下内容:

public Observable<Void> uploadFix(final ParseObject parseObject) {
    return Observable.defer(new Func0<Observable<Void>>() {
        @Override
        public Observable<Void> call() {
            try {
                return Observable.just(fix.save());
            } catch (ParseException e) {
                return Observable.error(e);
            }
        }
    });
}

这给我一个错误:Observable 不能应用于 void。

基本上有没有办法用 RxJava 包装这个调用并在保存成功时得到通知?

fix.save() return 无效,因此您不能将其用作 Observable.just() 的参数。您可以 return 布尔值代替。

public Observable<Boolean> uploadFix(final ParseObject parseObject) {
    return Observable.defer(new Func0<Observable<Boolean>>() {
        @Override
        public Observable<Boolean> call() {
            try {
                fix.save();
                return Observable.just(true);
            } catch (ParseException e) {
                return Observable.error(e);
            }
        }
    });
}

您也可以使用 Completable。当您不使用 return 值时使用它。如果 Android 的 RxJava 将升级到版本 2,您将不能再使用 Observabl,因为不再允许空值。

请看我的例子。我正在使用 RxJava2-RC5 进行测试。测试应在 2 秒 + 开销内完成。

@org.junit.Test
public void name() throws Exception {
        Completable completable = Completable.fromAction(() -> doWorkSync());

        TestObserver<Void> test = completable.test();

        test.assertComplete();
}

private void doWorkSync() {
        // simulate work
        try {
            Thread.sleep(2_000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
}