有人可以告诉我这段代码我哪里出错吗?基本上我希望该应用程序下载.png文件,将其显示给用户,并将其保存到SD卡以供将来参考。在while ((len = webstream.read(buffer)) > 0)
部分之前似乎一切顺利;因为调试器没有到达我在这里放置的断点,并且我有一个空的.png文件目录。我在我的清单中声明了WRITE_EXTERNAL_STORAGE
权限。
protected class DownloadTask extends AsyncTask<String, Integer, Bitmap> {
@Override
protected Bitmap doInBackground(String... string) {
Bitmap d = null;
try {
DefaultHttpClient dhc = new DefaultHttpClient();
HttpGet request = new HttpGet(HTTP_BASE + string[0] + ".png");
HttpResponse response = dhc.execute(request);
BufferedInputStream webstream = new BufferedInputStream(response.getEntity().getContent());
d = BitmapFactory.decodeStream(webstream);
writeToSd(string[0], webstream, d);
}
catch (Exception ex) { ex.printStackTrace(); }
return d;
}
private void writeToSd(String string, BufferedInputStream webstream, Bitmap d) {
try {
webstream.mark(3);
webstream.reset();
File f = new File(Environment.getExternalStorageDirectory() + SD_DIR);
f.mkdirs();
File f2 = new File(f, string + ".png");
f2.createNewFile();
BufferedOutputStream fos = new BufferedOutputStream(new FileOutputStream(f2));
int len;
byte[] buffer = new byte[1024];
while ((len = webstream.read(buffer)) > 0) {
fos.write(buffer, 0, len);
}
webstream.close();
//fos.flush();
fos.close();
}
catch (Exception ex) {
ex.printStackTrace();
}
}
protected void onPostExecute(Bitmap result) {
if (result != null) {
iv.setImageBitmap(result);
vs.setDisplayedChild(1);
}
}
};
答案 0 :(得分:1)
我不确定,但重新读取InputStream似乎有些问题,即使它是缓冲的。图像是存储在内存中的相当多的数据。而不是做
你可以尝试获取图像,显示图像,存储图像
获取图像,存储图像,显示图像
通过这种方式,您可以将完整大小的映像写入磁盘(无需缓冲流并消耗大量内存)。然后,您只需以适用于您的应用程序的最低采样率从SD卡加载图像,从而节省内存中的全尺寸图像。此外,这样做可能会消除您使用bufferedInputStream可能会或可能没有的任何问题 - 我发现它们非常挑剔。
答案 1 :(得分:1)
除非您需要原始流字节,否则可以使用Bitmap.compress(format, quality, stream)
将位图写入磁盘。
然而,从记忆保护的角度来看,哈米的答案可能是最好的。