在可观察到的 LiveData 上实现 Retrofit 错误的重试按钮
Implementing Retry button for Retrofit error on LiveData observable
这里是学习者,我正在尝试为 Retrofit Callback#onFailure
方法中出现错误时添加重试按钮。
稍微遵循 Android 架构指南,我能够调用、保留数据并将其显示在 RecyclerView 上。这是我到目前为止所做工作的一般流程:
在 PagedList.BoundaryCallback
我收到了回复并保存了。在这里,我还创建了一个 NetworkState
的 LiveData,我在 MainActivity
到 ViewModel
class.
内观察到它
@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
});
}
});
我在这里迷路了,不知道如果由于某种原因出现错误,如何实现重试按钮来进行最后一次调用。你能帮我看看“重试”按钮实际上应该做什么来获得回调吗?
谢谢。
P.S。我是 Java 的新手,到目前为止 Kotlin 不在我的行列中,所以无法弄清楚 Google 示例项目如何实施重试方法,而且我的示例项目也在 GitHub/DemoBlogApp 供任何参考。感谢任何帮助。
很久以前我自己想出来了,但一直在等待意见。虽然我什么都没有,但考虑过将答案发布到 myself 以便其他人可能会发现它有用。
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);
);
这里是学习者,我正在尝试为 Retrofit Callback#onFailure
方法中出现错误时添加重试按钮。
稍微遵循 Android 架构指南,我能够调用、保留数据并将其显示在 RecyclerView 上。这是我到目前为止所做工作的一般流程:
在 PagedList.BoundaryCallback
我收到了回复并保存了。在这里,我还创建了一个 NetworkState
的 LiveData,我在 MainActivity
到 ViewModel
class.
@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
});
}
});
我在这里迷路了,不知道如果由于某种原因出现错误,如何实现重试按钮来进行最后一次调用。你能帮我看看“重试”按钮实际上应该做什么来获得回调吗?
谢谢。
P.S。我是 Java 的新手,到目前为止 Kotlin 不在我的行列中,所以无法弄清楚 Google 示例项目如何实施重试方法,而且我的示例项目也在 GitHub/DemoBlogApp 供任何参考。感谢任何帮助。
很久以前我自己想出来了,但一直在等待意见。虽然我什么都没有,但考虑过将答案发布到 myself 以便其他人可能会发现它有用。
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);
);