23

使用 rxjava 1.xi 时用于返回Observable<Void>处理来自改造的空响应:

@POST( "login" )
Observable<Void> getToken( @Header( "Authorization" ) String authorization,
                                       @Header( "username" ) String username,
                                       @Header( "password" ) String password );

但是由于 rxjava 2.x 不会发出任何东西,Void有没有什么好的做法来处理那些空响应?

4

4 回答 4

45

Completable就是为这种情况而设计的。它RxJava 1.1.1 开始可用。来自官方文档:

表示没有任何值但仅指示完成或异常的延迟计算。该类遵循与 Reactive-Streams 类似的事件模式:onSubscribe (onError|onComplete)?

因此,只需更改方法的返回类型:

@POST("login")
Completable getToken(@Header("Authorization") String authorization,
                     @Header("username")      String username,
                     @Header("password")      String password);

并重写您的订阅者,例如:

apiManager.getToken(auth, name, pass)
    ...
    .subscribe(() -> {
        //success
    }, exception -> {
        //error
    });
于 2017-01-10T08:05:33.383 回答
7

另一种解决方案是:

@POST("login")
Observable<Response<Void>> getToken(@Header("Authorization") String authorization,
                                    @Header("username") String username,
                                    @Header("password") String password);

更新:但我宁愿使用 Completable

于 2017-12-08T10:46:55.377 回答
0

所以接受的答案只是部分正确。 Completable在预期只有一次发射的某些情况下会起作用,但是,Completable只会发射一次,之后不会发射。它类似于Single(除了我们忽略发出的值)。 Observable,另一方面,可以发射多次。因此,如果源 observable 将发出多次,那么至少在 RxJava2 中,答案是发出类似Observable<Irrelevant>Irrelevant静态枚举/类在哪里)之类的东西,或者更好Observable<Kotlin.Unit>

public class Source {
    private PublishSubject<Kotlin.Unit> heartbeatOperation;
...
    void getHeartbeats() {
         while(getHeartbeatFromSource() != null) {
             hearbeatOperation.accept(Unit.INSTANCE);
         }  
    }

    public Observable<Unit> heartbeats() {
         return hearbeatOperation.hide();
    }
...
}


public class SourceConsumer {
   @Inject Source source;
...
    void printHearbeats() {
         source.heartbeats()
         .subscribe(unused -> {
             System.out.println("Heartbeat received at " + DateTime.now());
         });
    }
}
于 2020-06-23T00:06:32.797 回答
-1

你试过用Observable<Object>吗?

这是来自 RxJava 2 的官方文档:

enum Irrelevant { INSTANCE; }

Observable<Object> source = Observable.create((ObservableEmitter<Object> emitter) -> {
   System.out.println("Side-effect 1");
   emitter.onNext(Irrelevant.INSTANCE);

   System.out.println("Side-effect 2");
   emitter.onNext(Irrelevant.INSTANCE);

   System.out.println("Side-effect 3");
   emitter.onNext(Irrelevant.INSTANCE);
});

source.subscribe(e -> { /* Ignored. */ }, Throwable::printStackTrace);
于 2017-01-10T08:23:27.797 回答