在这里学习,我正尝试为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()));
}
然后在用户界面上
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上,以供参考。任何帮助表示赞赏。
答案 0 :(得分:1)
很久以前就想通了,但正在等待别人的意见。尽管我一无所获,但还是想到了发布我自己的答案,以便其他人发现它有用。
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);
);