我有一个片段,在响应回调中有一个嵌套的改装调用。我正在取消对片段的onStop方法的两个请求,根据日志和调试它正在调用,因此也调用了两个改装调用的cancel()。
以下是嵌套调用的代码
serviceRequestTypesResponseCall.enqueue(new RetrofitCallback<ServiceRequestTypesResponse>(retrofit) {
@Override
public void onResponse(RetrofitResult<ServiceRequestTypesResponse> result) {
// get url from response and enqueue nested call
detailedServiceRequestTypeCall = scfServiceV2.getRequestType(result.getRequestTypeUrl());
detailedServiceRequestTypeCall.enqueue(new RetrofitCallback<DetailedServiceRequestType>(retrofit) {
@Override
public void onResponse(RetrofitResult<DetailedServiceRequestType> result) {
// this is being reached when cancelled
}
@Override
public void onFailure(RetrofitResult<DetailedServiceRequestType> error) {
// do something
}
});
}
@Override
public void onFailure(RetrofitResult<ServiceRequestTypesResponse> error) {
// do something
}
});
public void onStop() {
super.onStop();
// nested call
if(detailedServiceRequestTypeCall != null) {
detailedServiceRequestTypeCall.cancel();
}
// outer call
if(serviceRequestTypesResponseCall != null) {
serviceRequestTypesResponseCall.cancel();
}
}
嵌套调用从外部调用响应中获取动态URL,因此这就是它在改进界面中定义的方式
@GET
Call<DetailedServiceRequestType> getRequestType(@Url String url);
另外,这就是我在自定义回调类
中处理Retrofit取消的方法public abstract class RetrofitCallback<T> implements Callback<T> {
private static final String TAG = "RetrofitCallback";
protected final Retrofit retrofit;
public RetrofitCallback(Retrofit retrofit) {
this.retrofit = retrofit;
}
public abstract void onResponse(RetrofitResult<T> result);
public abstract void onFailure(RetrofitResult<T> error);
@Override
public final void onResponse(Call<T> call, Response<T> response) {
onResponse(new RetrofitResult<>(retrofit, response));
}
@Override
public final void onFailure(Call<T> call, Throwable t) {
if (call.isCanceled()) {
Log.d(TAG, "Cancelled => " + call.request().toString());
} else {
onFailure(new RetrofitResult<T>(t));
}
}
}
片段位于底栏导航(https://github.com/roughike/BottomBar bottombar)内,它基本上取代了标签选择时的片段。当片段显示时会发生请求,因此快速切换片段,以便没有时间让嵌套调用完成再现此问题。
logcat仅显示外部调用的取消日志。不知道为什么我没有得到相同的嵌套调用,尽管被明确取消。这导致请求完成并尝试执行一些ui相关逻辑并引用不再可用的活动,因为切换片段时片段已被替换