Handle Empty Response With Retrofit And Rxjava 2.x
Solution 1:
Completable was designed for such cases. It available since RxJava 1.1.1. From the official docs:
Represents a deferred computation without any value but only indication for completion or exception. The class follows a similar event pattern as Reactive-Streams: onSubscribe (onError|onComplete)?
So just change your method's return type:
@POST("login")
Completable getToken(@Header("Authorization") String authorization,
@Header("username") String username,
@Header("password") String password);
And rewrite your subscriber, e.g.:
apiManager.getToken(auth, name, pass)
...
.subscribe(() -> {
//success
}, exception -> {
//error
});
Solution 2:
Another solution is:
@POST("login")
Observable<Response<Void>> getToken(@Header("Authorization") String authorization,
@Header("username") String username,
@Header("password") String password);
Update: But I would rather use Completable
Solution 3:
So the accepted answer is only partially correct. Completable
will work in some cases where one and only one emission is expected, however, Completable
will only emit once, and will not emit after that. It is similar to Single
(except we ignore the value being emitted). Observable
, on the other hand, can emit multiple times. So if the source observable will emit multiple times, the answer, at least in RxJava2, is to emit something like Observable<Irrelevant>
(where Irrelevant
is a static enum/class), or better yet Observable<Kotlin.Unit>
.
publicclassSource {
private PublishSubject<Kotlin.Unit> heartbeatOperation;
...
voidgetHeartbeats() {
while(getHeartbeatFromSource() != null) {
hearbeatOperation.accept(Unit.INSTANCE);
}
}
public Observable<Unit> heartbeats() {
return hearbeatOperation.hide();
}
...
}
publicclassSourceConsumer {
@Inject Source source;
...
voidprintHearbeats() {
source.heartbeats()
.subscribe(unused -> {
System.out.println("Heartbeat received at " + DateTime.now());
});
}
}
Solution 4:
Did you try using Observable<Object>
?
This is from the official documentation of RxJava 2:
enumIrrelevant{ 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);
Post a Comment for "Handle Empty Response With Retrofit And Rxjava 2.x"