android - 在可观察到的 LiveData 上实现 Retrofit 错误的重试按钮

标签 android android-livedata android-paging

这里是学习者,我正在尝试为 Retrofit Callback#onFailure 方法中出现错误时添加重试按钮。

稍微遵循 Android 架构指南,我能够调用、保留数据并将其显示在 RecyclerView 上。以下是我到目前为止所做工作的一般流程:

PagedList.BoundaryCallback 上,我正在获取响应并保存它。在这里,我还创建了一个 NetworkState 的 LiveData,我在 MainActivity 中通过 ViewModel 类对其进行观察。

@Override
public void onZeroItemsLoaded() {
    if (isFetchNeeded())
        mClient.fetchFirstNetworkCall().enqueue(getRetrofitCallback());
}

@Override
public void onItemAtEndLoaded(@NonNull Item itemAtEnd) {
    if (mNextPageToken != null)
        mClient.fetchNextNetworkCall(mNextPageToken).enqueue(getRetrofitCallback());
}


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

    mObservableNetwork.setValue(NetworkState.LOADING);

    if (response.isSuccessful()) {
        mExecutors.diskIO().execute(() -> {
            insertItemsToDb(responseBody.getItems());

            mObservableNetwork.postValue(NetworkState.SUCCESS);
        });
    } else {
        String error = response.errorBody() == null ? "Unknown Error" : String.valueOf(response.errorBody());
        mObservableNetwork.setValue(NetworkState.error(error));
    }
}

@Override
public void onFailure(@NonNull Call<BloggerApi> call, @NonNull Throwable t) {
    mObservableNetwork.setValue(NetworkState.error(t.getMessage()));
}

然后在 UI 上:

mViewModel.getNetworkState().observe(this, networkState -> {
    if (networkState.getStatus() == Status.ERROR) {
        retryButton.setOnClickListener(view -> {
            // todo: Implement what to do
        });
    }
});

我在这里迷路了,如果由于某种原因我收到错误,我不知道如何实现重试按钮来进行最后一次调用。你能帮我看看“重试”按钮实际上应该做什么来获得回调吗?

谢谢。

附言我是 Java 的新手,到目前为止 Kotlin 不在我的范围内,所以无法弄清楚 Google 示例项目是如何实现重试方法的,而且我的示例项目也在 GitHub/DemoBlogApp 上。供任何引用。感谢您的帮助。

最佳答案

很久以前我自己想出来了,但一直在等待意见。虽然我没有得到任何答案,但考虑将答案发布到我自己,以便其他人可能会发现它有用。

Retrofit 有 clone() 方法,这对于失败的情况非常有用。所以基本上,制作一个界面:

public interface RetryCallback<T> {
    void getCall(Call<T> call, ApiCallback<T> callback);
}

改造失败时:

class Repository {

    RetryCallback<Api> retryCallback;
    //...

    new Callback<Api>() {
        // other Callback methods

        public void onFailure(Call<Api> call, Throwable t) {
            retryCallback.getCall(call, this);
        }
    }

    public void setRetryCallback(RetryCallback<Api> retryCallback) {
        this.retryCallback = retryCallback;
    } 
}

在 MainActivity 上:

//...
// Using lambda instead of initializing with new operator
viewModel.setRetryCallback((call, callback) ->
    call.clone().enqueue(callback);
);

关于android - 在可观察到的 LiveData 上实现 Retrofit 错误的重试按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51385881/

相关文章:

android - 在安卓中访问谷歌云打印

java - 更新 LiveData 返回的对象属性

java - 改造、实时数据适配器、使响应类包装器通用?

android - java.lang.IllegalStateException : Cannot invoke observeForever on a background thread

android - LiveData 无法通知它的观察者 PagedList 对象的变化

android - 使用分页库和导航架构组件将 recyclerview 的状态保持在 fragment 中

android - Firebase 多对多关系,如何检索数据

java - 如何在 GridView 中交换图像 (Android)

用于检查文本行的 Java 模式

android - 带有分页的房间实时数据在某些设备中出现 IndexOutOfBoundsException