Skip to content

Instantly share code, notes, and snippets.

@kuluna
Last active October 4, 2021 08:54
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save kuluna/fd3201e5dfed85de28be9f2b9704f4bf to your computer and use it in GitHub Desktop.
Save kuluna/fd3201e5dfed85de28be9f2b9704f4bf to your computer and use it in GitHub Desktop.
Retrofit πŸ’› LiveData for Android
data class ResponseBody<T>(
var body: T?,
var error: ResponseError?
)
data class ResponseError(
var statusCode: Int,
var message: String
)
import android.arch.lifecycle.LiveData
import android.arch.lifecycle.Observer
import android.util.Log
import retrofit2.*
class RetrofitLiveData<T>(private val call: Call<T>, private var retry: Int = 3) : LiveData<ResponseBody<T>>(), Callback<T> {
override fun onActive() {
if (!call.isCanceled && !call.isExecuted) call.enqueue(this)
}
override fun onFailure(call: Call<T>?, t: Throwable) {
Log.e("Response Error", "retry $retry", t)
retry -= 1
if (retry > 0) {
call?.clone()?.enqueue(this)
} else {
val err = ResponseError(0, t.localizedMessage ?: "")
postValue(ResponseBody(null, err))
}
}
override fun onResponse(call: Call<T>?, response: Response<T>?) {
try {
if (response != null) {
if (response.isSuccessful) {
postValue(ResponseBody(response.body(), null))
} else {
val err = ResponseError(response.code(), response.errorBody()?.string() ?: "")
Log.w("Response Error", err.message)
postValue(ResponseBody(null, err))
}
}
} catch (e: Exception) {
val err = ResponseError(0, e.localizedMessage ?: "")
postValue(ResponseBody(null, err))
}
}
fun cancel() {
if (!call.isCanceled) {
call.cancel()
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment