问题描述
我使用Android的春天在致力于执行春天的Android请求的线程。
I use spring android in a thread dedicated to execute spring android requests.
我无法实现中止从春天的Android(一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;
}
}
这篇关于取消/放弃/中断弹簧的Android resttemplate要求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!