我正在寻找下载Bitmaps阵列的最佳方法,稍微修改它们,然后保存到SD卡。如何下载Bitmaps并保存到SD卡而不会耗尽内存?
我听说ByteArrayOutputStream
是一个坏主意,因为它将图像加载到设备的RAM中。相反,我可能应该使用类似于BufferedInputStream
和FileOutputStream
的东西,但是我不知道如何在使用此方法保存之前更改位图。
感谢
我正在寻找下载Bitmaps阵列的最佳方法,稍微修改它们,然后保存到SD卡。如何下载Bitmaps并保存到SD卡而不会耗尽内存?
我听说ByteArrayOutputStream
是一个坏主意,因为它将图像加载到设备的RAM中。相反,我可能应该使用类似于BufferedInputStream
和FileOutputStream
的东西,但是我不知道如何在使用此方法保存之前更改位图。
感谢
你不会喜欢的答案:你不能(至少不与Android框架)。
唯一的选择是downscale the image,以便它适合内存;并定期拨打recycle()
和System.gc()
尽快释放内存。
您可以从InputStream
使用创建位图:
Bitmap bm = BitmapFactory.decodeStream(inputStream);
,然后选择已经处理完您的Bitmap
并储存它们,你必须使用:
bm.recycle();
bm = null;
避免OutOfMemoryExceptions
。
编辑:
对于其写入文件:
OutputStream fos=new BufferedOutputStream(new FileOutputStream(filePath));
byte buf[]=new byte[1024];
int len;
while((len=is.read(buf))>0)
fos.write(buf,0,len);
fos.close();
is.close();
是的,谢谢,我知道,但是如何在不使用ByteArrayOutputStream的情况下将位图写入SD卡上的文件? –
感谢你的 - 但你的代码是直接从inputStream读取,而不是位图:( –
是的,这几乎是我所害怕的。我猜我可以做的是使用BufferedInputStream下载图像,然后做我的位图操作。不是世界上最好的东西,但幸运的是我使用AsyncTask下载图像,所以我可以在onPostExecute()方法中做Bitmap的东西。非常感谢:) –
然后另一个建议:实现你的长时间运行的任务(下载,图像处理)使用'IntentService'而不是'AsyncTask'(参见http://stackoverflow.com/questions/2620917/how-to-handle-an-asynctask-during-screen-rotation http://www.google.com/events/io/2010/sessions/developing-RESTful-android-apps.html) – rds