parent
d04ded3910
commit
2f04af482d
@ -1,102 +0,0 @@ |
|||||||
package io.legado.app.help.http |
|
||||||
|
|
||||||
import kotlinx.coroutines.CompletableDeferred |
|
||||||
import kotlinx.coroutines.Deferred |
|
||||||
import retrofit2.* |
|
||||||
import java.lang.reflect.ParameterizedType |
|
||||||
import java.lang.reflect.Type |
|
||||||
|
|
||||||
class CoroutinesCallAdapterFactory private constructor() : CallAdapter.Factory() { |
|
||||||
companion object { |
|
||||||
fun create(): CoroutinesCallAdapterFactory { |
|
||||||
return CoroutinesCallAdapterFactory() |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
override fun get( |
|
||||||
returnType: Type, |
|
||||||
annotations: Array<out Annotation>, |
|
||||||
retrofit: Retrofit |
|
||||||
): CallAdapter<*, *>? { |
|
||||||
if (Deferred::class.java != getRawType(returnType)) { |
|
||||||
return null |
|
||||||
} |
|
||||||
check(returnType is ParameterizedType) { "Deferred return type must be parameterized as Deferred<Foo> or Deferred<out Foo>" } |
|
||||||
val responseType = getParameterUpperBound(0, returnType) |
|
||||||
|
|
||||||
val rawDeferredType = getRawType(responseType) |
|
||||||
return if (rawDeferredType == Response::class.java) { |
|
||||||
check(responseType is ParameterizedType) { "Response must be parameterized as Response<Foo> or Response<out Foo>" } |
|
||||||
ResponseCallAdapter<Any>( |
|
||||||
getParameterUpperBound( |
|
||||||
0, |
|
||||||
responseType |
|
||||||
) |
|
||||||
) |
|
||||||
} else { |
|
||||||
BodyCallAdapter<Any>(responseType) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private class BodyCallAdapter<T>( |
|
||||||
private val responseType: Type |
|
||||||
) : CallAdapter<T, Deferred<T>> { |
|
||||||
|
|
||||||
override fun responseType() = responseType |
|
||||||
|
|
||||||
override fun adapt(call: Call<T>): Deferred<T> { |
|
||||||
val deferred = CompletableDeferred<T>() |
|
||||||
|
|
||||||
deferred.invokeOnCompletion { |
|
||||||
if (deferred.isCancelled) { |
|
||||||
call.cancel() |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
call.enqueue(object : Callback<T> { |
|
||||||
override fun onFailure(call: Call<T>, t: Throwable) { |
|
||||||
deferred.completeExceptionally(t) |
|
||||||
} |
|
||||||
|
|
||||||
override fun onResponse(call: Call<T>, response: Response<T>) { |
|
||||||
if (response.isSuccessful) { |
|
||||||
deferred.complete(response.body()!!) |
|
||||||
} else { |
|
||||||
deferred.completeExceptionally(HttpException(response)) |
|
||||||
} |
|
||||||
} |
|
||||||
}) |
|
||||||
|
|
||||||
return deferred |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
private class ResponseCallAdapter<T>( |
|
||||||
private val responseType: Type |
|
||||||
) : CallAdapter<T, Deferred<Response<T>>> { |
|
||||||
|
|
||||||
override fun responseType() = responseType |
|
||||||
|
|
||||||
override fun adapt(call: Call<T>): Deferred<Response<T>> { |
|
||||||
val deferred = CompletableDeferred<Response<T>>() |
|
||||||
|
|
||||||
deferred.invokeOnCompletion { |
|
||||||
if (deferred.isCancelled) { |
|
||||||
call.cancel() |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
call.enqueue(object : Callback<T> { |
|
||||||
override fun onFailure(call: Call<T>, t: Throwable) { |
|
||||||
deferred.completeExceptionally(t) |
|
||||||
} |
|
||||||
|
|
||||||
override fun onResponse(call: Call<T>, response: Response<T>) { |
|
||||||
deferred.complete(response) |
|
||||||
} |
|
||||||
}) |
|
||||||
|
|
||||||
return deferred |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue