This works, however there’s a couple of tough edges:
- Our API isn’t declarative. To find out what state we’re in now we have to null test a bunch of issues and it’s straightforward to overlook a case
- We’ve inadvertently leaked our community serializer (moshi) into our software layer to deserialize error our bodies
- Streams get torn down when a community error happens. This isn’t a giant deal right here, but when we begin combining community streams with different Observables we doubtless don’t need community errors to terminate the ensuing stream
Let’s have a look at how we are able to use Retrofit’s CallAdapter API to nerf down these edges. We’ll use Sealed Classes to signify the results of community calls and construct error physique deserialization into Retrofit.
To have Retrofit return an occasion of NetworkResponse when the getTokens() API is invoked, now we have to put in writing a customized CallAdapter.Factory. The CallAdapter.Manufacturing facility beneath says, “I understand how to create situations of NetworkResponse which are emitted to RxJava streams."
When the getTokens() API is invoked, this CallAdapter.Manufacturing facility:
- Delegates to an adapter that is aware of learn how to make an occasion of the kind Observable<AccessToken> (line 46)
- Asks for a converter able to serializing the kind Error (line 54)
- Creates a KotlinRxJava2CallAdapter (line 60). This adapter deserializes error our bodies and can adorn the stream of Observable<AccessToken> right into a Single<NetworkResponse<AccessToken,Error>>
To make use of our customized CallAdapter.Manufacturing facility now we have to plug it into our Retrofit occasion. Adapter registration order is vital since we’ve written a delegating CallAdapter; we should register our adapter earlier than every other adapters it could delegate to. Within the snippet beneath we delegate the creation of Observable<AccessToken> to Sq.’s RxJava Adapter.
val retrofit = Retrofit.Builder()
When you’re curious about having a Kotlin-esque API to the wire that gives error physique deserialization, you'll find the complete code for our Adapter here.
P.S. We’re hiring!