thijs
09/05/2016, 1:35 PM/**
* This CallAdapter Factory makes sure all callbacks on [Observable] and [Single] are executed on the main thread.
*/
class AndroidRxJavaCallAdapterFactory: CallAdapter.Factory() {
private val rxJavaCallAdapterFactory = RxJavaCallAdapterFactory.createWithScheduler(<http://Schedulers.io|Schedulers.io>())
@Suppress("UNCHECKED_CAST")
override fun get(returnType: Type, annotations: Array<out Annotation>, retrofit: Retrofit): CallAdapter<*>? {
val callAdapter = rxJavaCallAdapterFactory.get(returnType, annotations, retrofit)
val rawReturnType = (returnType as? ParameterizedType)?.rawType
return when(rawReturnType) {
Observable::class.java -> AndroidObservableCallAdapter(callAdapter as CallAdapter<Observable<*>>)
Single::class.java -> AndroidSingleCallAdapter(callAdapter as CallAdapter<Single<*>>)
else -> callAdapter
}
}
private class AndroidObservableCallAdapter(val delegate: CallAdapter<Observable<*>>) : CallAdapter<Observable<*>> by delegate {
override fun <R : Any?> adapt(call: Call<R>?): Observable<*> {
return delegate
.adapt(call)
.observeOn(AndroidSchedulers.mainThread())
}
}
private class AndroidSingleCallAdapter(val delegate: CallAdapter<Single<*>>) : CallAdapter<Single<*>> by delegate {
override fun <R : Any?> adapt(call: Call<R>?): Single<*> {
return delegate
.adapt(call)
.observeOn(AndroidSchedulers.mainThread())
}
}
}