0

我正在寻找下载Bitmaps阵列的最佳方法,稍微修改它们,然后保存到SD卡。如何下载Bitmaps并保存到SD卡而不会耗尽内存?

我听说ByteArrayOutputStream是一个坏主意,因为它将图像加载到设备的RAM中。相反,我可能应该使用类似于BufferedInputStreamFileOutputStream的东西,但是我不知道如何在使用此方法保存之前更改位图。

感谢

回答

1

你不会喜欢的答案:你不能(至少不与Android框架)。

唯一的选择是downscale the image,以便它适合内存;并定期拨打recycle()System.gc()尽快释放内存。

+0

是的,这几乎是我所害怕的。我猜我可以做的是使用BufferedInputStream下载图像,然后做我的位图操作。不是世界上最好的东西,但幸运的是我使用AsyncTask下载图像,所以我可以在onPostExecute()方法中做Bitmap的东西。非常感谢:) –

+0

然后另一个建议:实现你的长时间运行的任务(下载,图像处理)使用'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

1

您可以从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(); 
+0

是的,谢谢,我知道,但是如何在不使用ByteArrayOutputStream的情况下将位图写入SD卡上的文件? –

+0

感谢你的 - 但你的代码是直接从inputStream读取,而不是位图:( –