本文介绍了取消/放弃/中断弹簧的Andr​​oid resttemplate要求的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用Android的春天在致力于执行春天的Andr​​oid请求的线程。

I use spring android in a thread dedicated to execute spring android requests.

我无法实现中止从春天的Andr​​oid(一getForObject例如)发起的请求。

I can't achieve to abort a request launched from spring android (a getForObject for instance).

我尝试:


  • 到达底层输入流关闭,但它完全包裹在springandroid restemplate且不能从外部访问

  • 中断线程

  • 得到休息模板的要求在工厂,并呼吁摧毁

  • 让工厂和呼叫关闭的连接管理器

  • 更改其余模板工厂的HTTP客户端

  • 更改其余模板厂的要求在工厂

但我不能中止请求,并快速发送一个新的。第一个必须达到的超时时间。

but I can't abort a request and send a new one quickly. The first one has to reach its timeout.

我怎么能杀春天的android请求获得一个稳定的休息模板发送一个新的请求?

How could I "kill" a spring android request a get a stable rest template to send a new request ?

先谢谢了。

推荐答案

我建议使用ResponseExtractor。

I suggest using ResponseExtractor.

您可以调用execute RestTemplate的方法,如下面的。

you can call execute method of RestTemplate such as below.

    File file = (File) restTemplate.execute(rootUrl.concat("/vocasets/{vocasetId}/{version}"), HttpMethod.GET, requestCallabck,
            responseExtractor, uriVariables);

ResponseExtractor有ExtractData由方法。你可以把体内的InputStream从ExtractData由法通过响应getBody()。

ResponseExtractor has extractData method. you can take body inputstream from extractData method through getBody() of response.

扩展ResponseExtractor取消您的请求。

Extend ResponseExtractor for canceling your request.

祝你好运。

在我的情况,我用监听的方式。

In my case, I've used Listener way.

static class FileResponseExtractor implements ResponseExtractor<File> {
            ...

    public void setListener(ReceivingListener listener) {
        this.listener = listener;
    }

    @Override
    public File extractData(ClientHttpResponse response) throws IOException {
        InputStream is = response.getBody();

        long contentLength = response.getHeaders().getContentLength();

        long availableSpace = AvailableSpaceHandler.getExternalAvailableSpaceInMB();
        long availableBytes = AvailableSpaceHandler.getExternalAvailableSpaceInBytes();
        Log.d(TAG, "available space: " + availableSpace + " MB");

        long spareSize = 1024 * 1024 * 100;
        if(availableBytes < contentLength + spareSize) {
            throw new NotEnoughWritableMemoryException(availableSpace);
        }

        File f = new File(temporaryFileName);
        if (f.exists())
            f.delete();
        f.createNewFile();

        OutputStream o = new FileOutputStream(f);

        listener.onStart(contentLength, null);
        boolean cancel = false;
        try {
            byte buf[] = new byte[bufferSize];
            int len;
            long sum = 0;
            while ((len = is.read(buf)) > 0) {
                o.write(buf, 0, len);
                sum += len;
                listener.onReceiving(sum, len, null);

                cancel = !listener.onContinue();
                if(cancel) {
                    Log.d(TAG, "Cancelled!!!");
                    throw new CancellationException();
                }
            }
        } finally {
            o.close();
            is.close();
            listener.onFinish(null);

            if(cancel) {
                f.delete();
            }
        }

        return f;

    }

}

这篇关于取消/放弃/中断弹簧的Andr​​oid resttemplate要求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-30 12:00