改进嵌套调用未被取消

时间:2016-11-07 14:38:50

标签: android android-fragments retrofit retrofit2

我有一个片段,在响应回调中有一个嵌套的改装调用。我正在取消对片段的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相关逻辑并引用不再可用的活动,因为切换片段时片段已被替换

0 个答案:

没有答案