Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在gridview适配器中回收位图?_Android - Fatal编程技术网

Android 如何在gridview适配器中回收位图?

Android 如何在gridview适配器中回收位图?,android,Android,我的android应用程序中有一个网格视图。我正在从服务器将图像加载到网格视图。我正在使用延迟加载。我必须回收这里创建的所有位图。如何在适配器或网格视图中执行Bitmap.recycle()。我的内存不足,请帮帮我。您需要显示一些代码(至少显示您的适配器)。如果出现内存不足错误,则可能没有正确实现视图回收,或者内存泄漏。也有可能只是一次加载了太多的大型位图,但如果可以加载视图,则更有可能是内存泄漏 没有人能够在不查看代码的情况下跟踪内存泄漏。Bitmap.recycle()不是一个解决方案,如果

我的android应用程序中有一个网格视图。我正在从服务器将图像加载到网格视图。我正在使用延迟加载。我必须回收这里创建的所有位图。如何在适配器或网格视图中执行Bitmap.recycle()。我的内存不足,请帮帮我。

您需要显示一些代码(至少显示您的适配器)。如果出现内存不足错误,则可能没有正确实现视图回收,或者内存泄漏。也有可能只是一次加载了太多的大型位图,但如果可以加载视图,则更有可能是内存泄漏

没有人能够在不查看代码的情况下跟踪内存泄漏。Bitmap.recycle()不是一个解决方案,如果剩下的代码没有问题,垃圾回收器在没有它的情况下就可以正常工作

请参阅:有关在android中管理内存和查找内存泄漏的精彩演讲

另外,请尝试:以示例说明如何下载图像或以其他方式将图像正确地异步加载到类似列表的视图中


编辑:还可以查看我编写的图像加载库,这样您就不必担心这些问题:

查看Android培训课程。它有一个教训,包括使用背景线程和内存和磁盘缓存在GridView中显示位图。

有一个非常简单的方法可以很好地工作:

首先,必须创建如下自定义ImageView:

public class ImageViewRecyclable extends ImageView
{
    private Bitmap bitmap;

    public ImageViewRecyclable(Context context)
    {
        super(context);
    }

    @Override
    public void setImageBitmap(Bitmap bm)
    {
        super.setImageBitmap(bm);
        if (bitmap != null) bitmap.recycle();
        this.bitmap = bm;
    }
}
我们的ImageViewRecyclable保留一个指向位图的指针,并在设置新位图之前循环使用旧位图

其次,您必须检查适配器的getView以查看convertView是否为null。如果不是null,则将其转换为自定义ImageViewRecyclable,并在其上设置位图。这样,在设置新位图之前,旧位图将被回收

这是适配器的getView代码:

@Override
public View getView(int position, View convertView, ViewGroup parent)
{
    ImageViewRecyclable imageView = (convertView == null) ? new ImageViewRecyclable(ActivityMain.this) : (ImageViewRecyclable) convertView;
    byte[] bytes = ....
    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    imageView.setImageBitmap(bitmap);

    return imageView;
}
我用1000个100x100图像测试了这段代码。最初的ImageView在显示50个带有内存错误的图像后失败,但该代码在网格结束之前工作得非常好

这段代码非常适用于小型脱机图像,但联机和大型图像需要缓存和其他东西。这可能有用,但必须应用一些更改