Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 取消/中止/中断spring android resttemplate请求_Java_Android_Multithreading_Networking_Resttemplate - Fatal编程技术网

Java 取消/中止/中断spring android resttemplate请求

Java 取消/中止/中断spring android resttemplate请求,java,android,multithreading,networking,resttemplate,Java,Android,Multithreading,Networking,Resttemplate,我在一个专门执行SpringAndroid请求的线程中使用SpringAndroid 我无法中止从SpringAndroid(例如getForObject)启动的请求 我试图: 到达底层输入流以关闭,但它完全包装在springandroid重新模板中,无法从外部访问 中断线程 获取rest模板的请求工厂并调用destroy 获取工厂的连接管理器并调用shutdown 更改rest模板工厂的http客户端 更改rest模板工厂的请求工厂 但我无法中止请求并快速发送新请求。第一个必须达到其超时

我在一个专门执行SpringAndroid请求的线程中使用SpringAndroid

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

我试图:

  • 到达底层输入流以关闭,但它完全包装在springandroid重新模板中,无法从外部访问
  • 中断线程
  • 获取rest模板的请求工厂并调用destroy
  • 获取工厂的连接管理器并调用shutdown
  • 更改rest模板工厂的http客户端
  • 更改rest模板工厂的请求工厂
但我无法中止请求并快速发送新请求。第一个必须达到其超时

我如何“杀死”一个spring android请求并获得一个稳定的rest模板来发送一个新请求


提前感谢。

我建议使用ResponseExtractor

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

    File file = (File) restTemplate.execute(rootUrl.concat("/vocasets/{vocasetId}/{version}"), HttpMethod.GET, requestCallabck,
            responseExtractor, uriVariables);
ResponseExtractor具有extractData方法。您可以通过响应的getBody()从extractData方法获取body inputstream

扩展ResponseExtractor以取消您的请求

祝你好运

在我的例子中,我使用了侦听器方式

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;

    }

}
静态类FileResponseExtractor实现ResponseExtractor{
...
公共void setListener(ReceivingListener侦听器){
this.listener=listener;
}
@凌驾
公共文件提取数据(ClientHttpResponse响应)引发IOException{
InputStream is=response.getBody();
long contentLength=response.getHeaders().getContentLength();
long availableSpace=AvailableSpaceHandler.getExternalAvailableSpaceInMB();
long availableBytes=AvailableSpaceHandler.getExternalAvailableSpaceInBytes();
Log.d(标签,“可用空间:+availableSpace+“MB”);
长spareSize=1024*1024*100;
if(可用字节<内容长度+稀疏化){
抛出新NotEnoughWritableMemoryException(可用空间);
}
文件f=新文件(临时文件名);
如果(f.exists())
f、 删除();
f、 createNewFile();
OutputStream o=新文件OutputStream(f);
onStart(contentLength,null);
布尔取消=假;
试一试{
字节buf[]=新字节[bufferSize];
内伦;
长和=0;
而((len=is.read(buf))>0){
o、 写入(buf,0,len);
sum+=len;
onReceiving(sum、len、null);
取消=!listener.onContinue();
如果(取消){
Log.d(标记“已取消!!!”);
抛出新的CancellationException();
}
}
}最后{
o、 close();
is.close();
onFinish(null);
如果(取消){
f、 删除();
}
}
返回f;
}
}

如何使用ResponseExtractor正确中断请求?我已经附加了如何实现FileResponseExtractor有没有一种方法可以将这样的提取器添加到rest模板实例发出的所有请求中?我有一个lib,开发者可以用他们想要的方式使用rest模板,我希望能够按需取消他们的请求,不管他们用什么方式使用rest模板;正在等待,直到下载所有字节。你能建议点什么来解决它吗?这可能是个愚蠢的主意,但是。。。将restTemplate请求包装到AsyncTask中怎么样?@Piotr,你看了吗?我对此感到困惑。我看到了许多示例,展示了如何使用AsyncTask发出HTTP请求,例如下载zip文件。将其用作restemplate.exchange的包装器有什么不同?