Android“试图使用回收的位图”错误?

我正在运行Android应用程序上的位图问题。 假设发生的事情是应用程序从网站下载图像,将它们保存到设备,将它们作为位图加载到内存中,并将其显示给用户。 这一切工作正常,当应用程序第一次启动。 不过,我已经为删除图像的用户添加了一个刷新选项,上面概述的过程从头开始。

我的问题:通过使用刷新选项旧图像仍然在内存中,我会很快得到OutOfMemoryErrors。 因此,如果图像正在刷新,我已经通过数组列表并回收旧图像。 但是,当应用程序将新图像加载到数组列表时,它会崩溃,并显示“试图使用回收的位图”错误。

据我所知,回收一个位图会破坏位图并释放其他对象的内存。 如果我想再次使用位图,它必须重新初始化。 我相信,当新文件被加载到数组列表时,我正在做这件事,但还是有一些错误。 任何帮助非常感谢,因为这是非常令人沮丧的。 问题代码如下。 谢谢!

public void fillUI(final int refresh) { // Recycle the images to avoid memory leaks if(refresh==1) { for(int x=0; x<images.size(); x++) images.get(x).recycle(); images.clear(); selImage=-1; // Reset the selected image variable } final ProgressDialog progressDialog = ProgressDialog.show(this, null, this.getString(R.string.loadingImages)); // Create the array with the image bitmaps in it new Thread(new Runnable() { public void run() { Looper.prepare(); File[] fileList = new File("/data/data/[package name]/files/").listFiles(); if(fileList!=null) { for(int x=0; x<fileList.length; x++) { try { images.add(BitmapFactory.decodeFile("/data/data/[package name]/files/" + fileList[x].getName())); } catch (OutOfMemoryError ome) { Log.i(LOG_FILE, "out of memory again :("); } } Collections.reverse(images); } fillUiHandler.sendEmptyMessage(0); } }).start(); fillUiHandler = new Handler() { public void handleMessage(Message msg) { progressDialog.dismiss(); } }; 

}

Solutions Collecting From Web of "Android“试图使用回收的位图”错误?"

您实际上并不需要在这里调用回收方法。 刷新button应该只清除数组,垃圾收集器稍后将释放内存。 如果您使用OutOfMemory,则意味着其他一些对象仍在引用旧图像,并且垃圾收集器无法删除它们。

我可以推测,一些ImageViews显示您的位图,并保持对该位图的引用。 当他们仍然显示时,您不能删除旧的位图。 所以一个可能的解决scheme是清除ImageVIews。 之后,您可以清除数组并填充新的图像。

回收释放内存,但一些ImageView仍然显示位图,它不能这样做后回收,这就是为什么你“试图使用回收位图”。

这些都只是一个假设,因为我看不到你的完整的代码。

如果内存非常大,您最好自己回收一下位图。 GC不能被控制。