【问题标题】:Cancel / abort / interrupt a spring-android resttemplate request取消/中止/中断 spring-android resttemplate 请求
【发布时间】:2012-09-13 22:14:07
【问题描述】:

我在一个专门用于执行 spring android 请求的线程中使用 spring android。

我无法中止从 spring android 启动的请求(例如 getForObject)。

我试过了:

  • 到达要关闭的底层输入流,但它完全包裹在 springandroid restemplate 中,无法从外部访问
  • 中断线程
  • 获取rest模板的请求工厂并调用destroy
  • 获取工厂的连接管理器并调用shutdown
  • 更改其余模板工厂的http客户端
  • 更改其余模板工厂的请求工厂

但我无法中止请求并快速发送新请求。第一个必须达到超时。

我怎样才能“杀死”一个 spring android 请求以获得一个稳定的休息模板来发送一个新请求?

提前致谢。

【问题讨论】:

  • 这可能是个愚蠢的想法,但是......在 AsyncTask 中包装 restTemplate 请求怎么样?
  • @Piotr,你看过stackoverflow.com/a/13082084/693752 吗?
  • 我对此感到困惑。我看到很多例子展示了如何使用 AsyncTask 发出 HTTP 请求,例如下载 zip 文件。将其用作 RestTemplate.exchange 的包装器有何不同?

标签: java android multithreading networking resttemplate


【解决方案1】:

我建议使用 ResponseExtractor。

你可以调用RestTemplate的execute方法,如下所示。

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

ResponseExtractor 有 extractData 方法。您可以通过响应的 getBody() 从 extractData 方法获取正文输入流。

扩展 ResponseExtractor 以取消您的请求。

祝你好运。

就我而言,我使用了 Listener 方式。

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;

    }

}

【讨论】:

  • 我怎样才能使用 ResponseExtractor 正确中断请求?
  • 我已经附加了如何实现 FileResponseExtractor
  • 有没有办法将这样的提取器添加到休息模板实例发出的所有请求中?我有一个库,开发人员可以在其中以他们想要的方式使用休息模板,我希望能够按需取消他们的请求,无论他们以何种方式使用休息模板。
  • 就我而言是.close();正在等待,直到所有字节都被下载。你能建议什么来解决它吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 2011-01-28
  • 2015-10-23
  • 1970-01-01
  • 2017-06-27
  • 1970-01-01
相关资源
最近更新 更多