【问题标题】:Android out of memory error on choosing second imageAndroid 在选择第二张图片时出现内存不足错误
【发布时间】:2013-08-07 22:13:13
【问题描述】:

我的应用程序的工作方式是退出主要活动,启动第二个活动,显示用户选择的图像并分析图像。

分析完第一张图片后,我使用后退按钮回到主Activity,再次进入第二张Activity选择第二张图片。但是一旦用户选择了第二张图片,android就会给我一个内存不足的错误。我尝试跟踪可用内存。奇怪的是,在选择第二张图像之前,可用内存比选择第一张图像之前还要多。 我应该如何解决这个问题? 谢谢!

PS 代码在 BitmapFactory.decodeFile(picturePath);

【问题讨论】:

    标签: android memory out-of-memory main-activity


    【解决方案1】:

    如果您在 3.0 之前的硬件上运行,您看到的内存值将不包括位图使用的内存,因此这可能是您描述的行为的原因。

    根据经验,您应该始终检查您的应用动态检索的图像尺寸(从用户选择或从网络),并将其缩放到适合您的应用的大小。例如,对于图库应用程序,它应该将手机拍摄的图片重新缩放到屏幕尺寸。下面是解码缩放位图的代码示例:

    private Bitmap decodeFile(File f, int width_tmp, int height_tmp, int maxSize) {
        try {
            // decode image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            InputStream in = new FileInputStream(f);
            BitmapFactory.decodeStream(in, null, o);
            try {
                in.close();
            } catch (IOException e1) {
            }
            // Find the correct scale value. It should be the power of 2.
            int scale = 1;
            while (maxSize > 0) {
                if (width_tmp / 2 < maxSize
                        || height_tmp / 2 < maxSize) {
                    break;
                }
                width_tmp /= 2;
                height_tmp /= 2;
                scale++;
            }
    
            // decode with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            in = new FileInputStream(f);
            Bitmap bm = BitmapFactory.decodeStream(in, null, o2);
            try {
                in.close();
            } catch (IOException e1) {
            }
            return bm;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
    

    【讨论】:

      【解决方案2】:

      假设您正在使用 Bitmap 类,您应该在使用完位图实例后调用 recycle() 方法。

      @Override 
      protected void onDestroy(){
          super.onDestroy();
          mBitmap.recycle();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-17
        • 1970-01-01
        • 1970-01-01
        • 2018-12-17
        • 1970-01-01
        • 2013-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多