Модернизация создать единый класс для всего состояния сети - PullRequest
2 голосов
/ 12 января 2020

Есть ли способ обработки состояния сети в одном классе, например загрузка, успех, сбой?

1 Ответ

2 голосов
/ 12 января 2020

Попробуйте, это в моем проекте с liveata.

const val TESTING_NETWORK_DELAY = 1000L

abstract class NetworkBoundResource<ResponseObject, ViewStateType> {

internal val result = MediatorLiveData<DataState<ViewStateType>>()

init {
    result.value = DataState.loading(true)

    GlobalScope.launch(Dispatchers.IO) {
        delay(TESTING_NETWORK_DELAY)

        withContext(Dispatchers.Main) {
            val apiResponse = createCall()
            result.addSource(apiResponse) { response ->
                result.removeSource(apiResponse)
                handleNetworkCall(response)
            }
        }
    }
}

fun handleNetworkCall(response: GenericApiResponse<ResponseObject>) {

    when (response) {
        is ApiSuccessResponse -> {
            handleApiSuccessResponse(response)
        }
        is ApiErrorResponse -> {
            println("DEBUG: NetworkBoundResource: ${response.errorMessage}")
            onReturnError(response.errorMessage)
        }
        is ApiEmptyResponse -> {
            println("DEBUG: NetworkBoundResource: Request returned NOTHING (HTTP 204)")
            onReturnError("HTTP 204. Returned NOTHING.")
        }
    }
}

fun onReturnError(message: String) {
    result.value = DataState.error(message)
}

abstract fun handleApiSuccessResponse(response: ApiSuccessResponse<ResponseObject>)

abstract fun createCall(): LiveData<GenericApiResponse<ResponseObject>>

fun asLiveData() = result as LiveData<DataState<ViewStateType>>

}

...