Skip to content

Instantly share code, notes, and snippets.

@Tougee
Last active June 19, 2019 09:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Tougee/8fea4bf1bb270ed5b4fa184a675d871e to your computer and use it in GitHub Desktop.
Save Tougee/8fea4bf1bb270ed5b4fa184a675d871e to your computer and use it in GitHub Desktop.
Handle network response provide by Retrofit suspend style function
fun fetchFoo() = GlobalScope.launch {
handleNetworkResponse<Foo, Unit>(
invokeNetwork = {
fooService.fetchFoo()
},
successBlock = { r ->
// success logic
},
errorBlock = {
// error logic
},
exceptionBlock = {
// exception logic
}
)
}
interface FooService {
@GET("foo")
suspend fun fetchFoo(): NetworkResponse<Foo>
}
suspend fun <T, R> handleNetworkResponse(
invokeNetwork: suspend () -> NetworkResponse<T>,
switchContext: CoroutineContext? = null,
successBlock: (suspend (NetworkResponse<T>) -> R)? = null,
errorBlock: (() -> R)? = null,
exceptionBlock: (() -> R)? = null
): R? {
val response = if (switchContext != null) {
try {
withContext(switchContext) {
invokeNetwork()
}
} catch (t: Throwable) {
// default logic like handleException(t)
return exceptionBlock?.invoke()
}
} else {
try {
invokeNetwork()
} catch (t: Throwable) {
// default logic like handleException(t)
return errorBlock?.invoke()
}
}
return if (response.isSuccess) {
successBlock?.invoke(response)
} else {
// default logic like handleErrorCode(response.errorCode)
errorBlock?.invoke()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment