我正在创建简单的类,该类使用HttpURLConnection将请求发送到服务器并接收响应。我想添加一个中断当前请求的interrupt()方法(想象中的请求正在AsyncTask中运行,并且从主线程调用interrupt())。有2个过程需要很多时间,我不知道如何打断它们:
假设我想例如中断从我这样读取的输入流中的读取:
downloadThread = new Thread(new Runnable() {
@Override
public void run() {
try {
buffer = readFully(connection.getInputStream());
} catch( Exception e ) {
e.printStackTrace();
}
}
});
downloadThread.start();
而readFully()方法是:
public byte[] readFully(InputStream input) throws IOException {
byte[] buffer = new byte[8192];
int bytesRead;
ByteArrayOutputStream output = new ByteArrayOutputStream();
while ((bytesRead = input.read(buffer)) != -1) {
output.write(buffer, 0, bytesRead);
}
return output.toByteArray();
}
如何停止从输入流中读取(换句话说,下载)?Thread的stop()方法已被弃用,无法使用。我到处应该定期检查是否应该停止线程并手动停止线程。但是,当我全神贯注于这一行时,我该怎么做(如果我理解得很好):
connection.getInputStream()
我认为这是同一种问题,但尚未得到答案(请参阅解决方案的注释):如何在Android上停止HttpURLConnection连接请不要将我引向某些REST库。我真的很想知道如何处理这个问题。谢谢 ;)。
connection.getInputStream()
与服务器建立连接后,客户端将准备开始流式传输响应时将返回。
因此,这取决于连接:例如,如果要下载大文件,则在readFully()
流式传输方法时,应将大部分时间(几乎所有时间)都花在方法内部,而如果响应非常短,readFully()
则将非常有用小。
在第一种情况下,最简单的“中断”方法是设置一个布尔标志,并在循环内对其进行检查。
while ((bytesRead = input.read(buffer)) != -1)
{
if (cancelled)
return null;
output.write(buffer, 0, bytesRead);
}
isCancelled()
如果要在的AsyncTask
s中实现此“布尔标志” doInBackground()
(推荐),则可以使用该方法。
在第二种情况下,除了直接杀死线程(根本不建议)以外,您无能为力。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句