我在一个专门执行 spring android 请求的线程中使用 spring android。
我无法中止从 spring android 发起的请求(例如 getForObject)。
我尝试过了 :
- 到达底层输入流关闭但它完全包裹在springandroid restemplate中,无法从外部访问
- 中断线程
- 获取其余模板的请求工厂并调用 destroy
- 获取工厂的连接管理器并调用 shutdown
- 更改其余模板工厂的http客户端
- 更改其余模板工厂的请求工厂
但我无法中止请求并快速发送新请求。第一个必须达到超时时间。
我怎样才能“杀死”一个 spring android 请求并获得一个稳定的休息模板来发送新请求?
提前致谢。
我建议使用 ResponseExtractor。
您可以调用 RestTemplate 的执行方法,如下所示。
File file = (File) restTemplate.execute(rootUrl.concat("/vocasets/{vocasetId}/{version}"), HttpMethod.GET, requestCallabck,
responseExtractor, uriVariables);
ResponseExtractor 有 extractData 方法。您可以通过响应的 getBody() 从 extractData 方法获取正文输入流。
扩展 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;
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)