在我的应用程序中,我使用Drawable.createFromStream(inputStream, null);
从Web下载图像,其中inputStream
使用以下代码拍摄:
connection = new URL(url).openConnection();
connection.setConnectTimeout(1000);
connection.setReadTimeout(1000);
imagesRenderer.downloadStream = connection.getInputStream();
图像可能很大,当我想停止下载图像时,问题就开始了。由于NetworkOnMainThreadException
,调用inputStream.close()
既不能直接从UI线程调用,也不能与后台线程一起调用,如以下代码所示:
new Thread(new Runnable() {
@Override
public void run() {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
这一次似乎不起作用:操作完成了,就好像没有人试图阻止它一样
所以我想知道,有没有办法立即关闭网络流,或者我必须用另一种方式实现图像下载?如果是这样,正确的方法是什么?
好吧,在图像下载和创建可绘制文件之间使用缓冲区解决了这个问题:
downloadStream = connection.getInputStream();
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
while (!needsCancel) {
int r = downloadStream.read(buffer);
if (r == -1) break;
out.write(buffer, 0, r);
}
d = Drawable.createFromStream(new ByteArrayInputStream(out.toByteArray()), null);