通过改造和rxjava 2.x处理空响应

时间:2017-01-09 23:36:56

标签: android rx-java rx-java2

当使用rxjava 1.x时,我曾经返回Observable<Void>来处理来自改造的空响应:

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

但是由于rxjava 2.x不会使用Void发出任何内容,是否有任何好的做法来处理这些空响应?

4 个答案:

答案 0 :(得分:31)

Completable专为此类案件而设计。它可用since 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
    });

答案 1 :(得分:5)

另一种解决方案是:

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

答案 2 :(得分:0)

因此,接受的答案仅部分正确。 Completable在某些情况下会工作,并且预计只有一种发射,但是Completable仅发射一次,此后不会发射。它类似于Single(除了我们忽略正在发出的值)。另一方面,Observable可以发出多次次。因此,如果可观察到的源将发出多次,至少在RxJava2中,答案是发出类似Observable<Irrelevant>(其中Irrelevant是静态枚举/类)或更佳的{{1} }。

Observable<Kotlin.Unit>

答案 3 :(得分:-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);