【问题标题】:Custom GridView causes out of memory error while loading lots of images加载大量图像时自定义 GridView 导致内存不足错误
【发布时间】:2013-06-24 07:24:57
【问题描述】:

我有一个 gridview 的自定义布局。每个原始的 gridview 都包含一个进度条、两个图像视图和两个文本视图。图像大小是缩略图大小。虽然我必须加载大量位图,例如:- 500 张图像,这会导致内存不足错误。图像是第一次从 Internet 加载,然后存储在 SD 卡中,下次加载从 SD 卡加载的 gridview 时。如何克服这个问题。如果gridview被单个imageview膨胀,我已经找到了很多解决内存不足的问题。请建议我如何在使用自定义布局时克服此问题。如果您知道任何示例项目在 gridview 中处理此内存不足错误,同时在 gridview 中膨胀自定义布局,请告诉我。

【问题讨论】:

标签: android gridview out-of-memory


【解决方案1】:

最好创建一个扩展 Application 的类。这 应用程序类会在任何时候给你 onlowmemory() 回调 应用程序内存不足。在那里你可以写

public void onLowmemory() {

Runtime.getRuntime().gc(); }

这将调用系统 GC 方法。执行垃圾收集器时 android 将垃圾所有未使用的对象。

还有另一种方法可以解决这个问题。在动画中你可以调用 Runtime.getRuntime().gc();调用垃圾收集器。也在 活动 onDestroy() 方法你可以调用 Runtime.getRuntime().gc();

这样你的问题就解决了

【讨论】:

    【解决方案2】:

    我也面临同样的问题。 OutOfMemoryError 通常是由 第一种方法是

    BitmapFactory.decodeFile(srcImg);
    

    由于图像在显示之前会转换为位图,因此位图很大通常会导致错误。

    为了克服这个问题,我添加了以下功能

    public static Bitmap decodeWithBounds(String srcImg, int bounds) {
        if (bounds > 0){
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(srcImg, options);
    
            if (options.outHeight > bounds || options.outWidth > bounds){
                options.inSampleSize = Math.max(options.outHeight/bounds, options.outWidth/bounds);
            }
            options.inJustDecodeBounds = false;
            return BitmapFactory.decodeFile(srcImg, options);
        } else {
            return BitmapFactory.decodeFile(srcImg);
        }
    }
    

    我用这个函数来解码位图,bounds = grid size。

    这解决了大部分问题。

    对于非常低端的设备,添加 try{} catch (OutOfMemoryError e){} ...

    【讨论】:

      【解决方案3】:

      尝试在图像中为 gridview out of memory 设置此代码

      BitmapFactory.Options options=new BitmapFactory.Options();
      options.inSampleSize = 8;//you set size qulity for image(2,3,,4,5,6,7,8 etc..) 
      Bitmap preview_bitmap=BitmapFactory.decodeStream(is,null,options);
      

      在您的图像视图中设置此位图

      【讨论】:

        【解决方案4】:

        使用此代码解决内存不足异常问题

        Bitmap bitmap = BitmapFactory.decodeStream(is);
        if (bitmap != null) {
            Bitmap resizedBitmap = Bitmap.createScaledBitmap(bitmap, 100, 100, true);
            imageView = new ImageView(mContext);
            imageView.setImageBitmap(resizedBitmap);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-10-23
          • 1970-01-01
          • 1970-01-01
          • 2014-08-12
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多