Обрабатывать пустой отклик с помощью модификации и rxjava 2.x

При использовании 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, есть ли хорошая практика для обработки этих пустых ответов?

Ответ 1

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
    });

Ответ 2

Другое решение:

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

Ответ 3

Вы пытались использовать 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);