改造+ Okhttp取消操作不起作用

时间:2015-07-17 11:25:13

标签: android httprequest retrofit okhttp cancellation

我正在使用像我这样的应用程序进行改造

  static void Main(string[] args)
    {
        double[] xVal = new double[9]
        {

    ...


           };
        double[] yVal = new double[9]  {
     ...

        };
        double rsquared;
        double yintercept;
        double slope;
        LinearRegression(xVal, yVal,0,9, out rsquared, out yintercept, out slope);
        Console.WriteLine( yintercept + (slope*15));//15 is xvalue of future(no of day from 1)

        Console.ReadKey();
    }
    public static void LinearRegression(double[] xVals, double[] yVals,
                                        int inclusiveStart, int exclusiveEnd,
                                        out double rsquared, out double yintercept,
                                        out double slope)
    {
        Debug.Assert(xVals.Length == yVals.Length);
        double sumOfX = 0;
        double sumOfY = 0;
        double sumOfXSq = 0;
        double sumOfYSq = 0;
        double ssX = 0;
        double ssY = 0;
        double sumCodeviates = 0;
        double sCo = 0;
        double count = exclusiveEnd - inclusiveStart;

        for (int ctr = inclusiveStart; ctr < exclusiveEnd; ctr++)
        {
            double x = xVals[ctr];
            double y = yVals[ctr];
            sumCodeviates += x * y;
            sumOfX += x;
            sumOfY += y;
            sumOfXSq += x * x;
            sumOfYSq += y * y;
        }
        ssX = sumOfXSq - ((sumOfX * sumOfX) / count);
        ssY = sumOfYSq - ((sumOfY * sumOfY) / count);
        double RNumerator = (count * sumCodeviates) - (sumOfX * sumOfY);
        double RDenom = (count * sumOfXSq - (sumOfX * sumOfX))
         * (count * sumOfYSq - (sumOfY * sumOfY));
        sCo = sumCodeviates - ((sumOfX * sumOfY) / count);

        double meanX = sumOfX / count;
        double meanY = sumOfY / count;
        double dblR = RNumerator / Math.Sqrt(RDenom);
        rsquared = dblR * dblR;
        yintercept = meanY - ((sCo / ssX) * meanX);
        slope = sCo / ssX;
    }

发送请求后我正在呼叫

 final OkHttpClient okHttpClient = new OkHttpClient();
 okHttpClient.interceptors().add(new YourInterceptor());

            final OkClient okClient = new OkClient(okHttpClient);
            Builder restAdapterBuilder = new RestAdapter.Builder();
            restAdapterBuilder.setClient(okClient).setLogLevel(LogLevel.FULL)
                    .setEndpoint("some url");
            final RestAdapter restAdapter = restAdapterBuilder.build();


public class YourInterceptor implements Interceptor {

    @Override
    public Response intercept(Chain chain) throws IOException {
        // TODO Auto-generated method stub
        Request request = chain.request();

        if (request != null) {
            Request.Builder signedRequestBuilder = request.newBuilder();
            signedRequestBuilder.tag("taggiventorequest");
            request = signedRequestBuilder.build();
            request.tag();
        }
        return chain.proceed(request);
    }
}

但是请求没有取消我收到了改造的回复 不知道为什么它没有取消我的要求

我需要排球,比如取消改装

2 个答案:

答案 0 :(得分:6)

作为Retrofit API Spec,取消请求将包含在2.0版中。

  

取消()是收到回复后的无操作。在所有其他   在这种情况下,该方法会将任何回调设置为null(从而释放强大的   如果匿名声明,则引用封闭类)   请求对象死了。以后与请求的所有交互   对象将抛出异常。如果请求在等待   执行者将取消其未来,以便永远不会被调用。

现在,您可以通过创建自定义回调类来实现,该类在回调时通过回调实现。

public abstract class CancelableCallback<T> implements Callback<T> {

    private boolean canceled;
    private T pendingT;
    private Response pendingResponse;
    private RetrofitError pendingError;

    public CancelableCallback() {
        this.canceled = false;
    }

    public void cancel(boolean remove) {
        canceled = true;
    } 

    @Override
    public void success(T t, Response response) {
        if (canceled) {
            return;
        }
        onSuccess(t, response);
    }

    @Override
    public void failure(RetrofitError error) {
        if (canceled) {
            return;
        }
        onFailure(error);
    }

    protected abstract void onSuccess(T t, Response response);

    protected abstract void onFailure(RetrofitError error);
}

MyApi.java,

private interface MyApi {
    @GET("/")
    void getStringList(Callback<List<String>> callback);
}

在活动或片段中,

RestAdapter restAdapter = new RestAdapter.Builder()
            .setEndpoint(Config.URL)
            .build();
MyApi service = restAdapter.create(MyApi.class);
CancelableCallback callback = new CancelableCallback<List<String>>() {
    @Override
    protected void onSuccess(List<String> stringList, Response response) {
        for (String str : stringList) {
            Log.i("Result : ", str);
        }
    }

    @Override
    protected void onFailure(RetrofitError error) {
        Log.e("Error : ", error.getMessage() + "");
    }
};

service.getStringList(callback);

要取消您的请求,请致电

callback.cancel();

这是取消每个请求的简单示例。您可以通过创建回调管理器类来同时处理(取消,暂停,恢复)两个或多个请求。请查看that comment以供参考。

希望它对你有用。

答案 1 :(得分:2)

问题是请求已完成,来自docs:

http://square.github.io/okhttp/javadoc/com/squareup/okhttp/OkHttpClient.html#cancel-java.lang.Object-

cancel
     

public OkHttpClient cancel(Object tag)

     

取消标记为tag的所有已安排或正在进行的呼叫。已完成的请求无法取消。