Как получить код состояния HTTP (400, 200 ...) на Observer - PullRequest
0 голосов
/ 24 февраля 2020

Есть ли способ получить код состояния HTTP (например, 200, 400 ...), прежде чем вы сможете наблюдать живые данные?

Это моя реализация:

Результат

sealed class Result<out T: Any> {

    data class Success<out T : Any>(val data: T?): Result<T>()
    data class Error(val exception: Exception): Result<Nothing>()
}

Базовый репозиторий

open class BaseRepository {

    suspend fun <T: Any> safeApiCall(call: suspend () -> Response<T>, errorMessage: String): T? {
        val result: Result<T> = safeApiResult(call, errorMessage)
        var data: T? = null

        when(result) {
            is Result.Success ->
                data = result.data
            is Result.Error -> {
                Logger.getLogger("1.DataRepository").log(Level.INFO, "$errorMessage & Exception - ${result.exception}")
            }
        }

        return data
    }

    private suspend fun <T: Any> safeApiResult(call: suspend ()-> Response<T>, errorMessage: String): Result<T> {
        val response = call.invoke()

        if (response.isSuccessful) return Result.Success(response.body())

        return Result.Error(IOException("Error Occurred during getting safe Api result, Custom ERROR - $errorMessage"))
    }
}

Мой репозиторий

class UserRepository (private val api : UserService) : BaseRepository() {

    suspend fun getFavorites() : MutableList<Favorite>? {
        return safeApiCall(
            call = {api.getFavorites().await()},
            errorMessage = "Error Fetching Favorites"
        )?.toMutableList()
    }
}

ViewModel

class UserViewModel : ViewModel() {

    private val parentJob = Job()

    private val coroutineContext: CoroutineContext
        get() = parentJob + Dispatchers.Default

    private val scope = CoroutineScope(coroutineContext)

    private val repository: UserRepository = UserRepository(ApiFactory.Apifactory.userService)

    val favoritesLiveData = MutableLiveData<MutableList<Favorite>>()

    fun fetchFavorites() {
        scope.launch {
            val favorites = repository.getFavorites()
            favoritesLiveData.postValue(favorites)
        }
    }
}

В своем коде я делаю что-то вроде этого:

userViewModel.fetchFavorites()

userViewModel.favoritesLiveData.observe(this, Observer {

})

Где я могу проверить код состояния? Я не могу понять, где реализовать возврат кода состояния.

1 Ответ

0 голосов
/ 24 февраля 2020

Вы не делаете это из оперативных данных, так как это последний (или, если быть точным, один перед последним) этап, когда ваши данные представляются пользователю путем заполнения представлений в вашей деятельности / фрагмент и т. Д. c ...

Чтобы выполнить sh, вам необходимо проверить его в своем хранилище или в viewModel.

, прежде чем анализировать результаты своих моделей, вы можете проверить код вашего ответа

Что-то вроде

public abstract class SuccessCallback<T> extends BaseCallBack<T> implements Callback<T>{


    @Override
    public void onResponse(Call<T> call, Response<T> response) {

        if(response.code()>= 400 && response.code() < 599){
             onFailure(response);
        }
        else {
            onSuccess(response);
        }

    }

    @Override
    public void onFailure(Call<T> call, Throwable t){

    }

    @Override
    public void onSuccess(Response<T> response) {

    }

    @Override
    public void onFailure(Response<T> response) {

    }
}

Вы можете увидеть другие решения (включая это) из ссылка

Редактировать

Я думаю, у вас будет доступ к коду из объекта ответа в функции safeApiResult. Просто попробуйте response.code

...