【问题标题】:ViewPager error(VM wont let us allocate)ViewPager 错误(VM 不会让我们分配)
【发布时间】:2014-01-29 16:58:01
【问题描述】:

我在显示图像时遇到问题,我正在使用 Samsung Galaxy Captivate i897 测试我的程序,所以,问题是我想显示图像,我使用 ViewPager 执行此操作,但 ViewPager 总是实例化三个图像(方法instanceiteItem),之前,显示和之后的图像,我的图像是 5MB,所以 LogCat 给了我这个错误

01-29 11:35:48.656:E/dalvikvm-heap(1275):19660800 字节的外部分配对于此进程来说太大。 01-29 11:35:48.679: E/GraphicsJNI(1275): VM 不允许我们分配 19660800 字节

我想知道如何避免实例化 3 张图片中的某些图片,或者如何创建一个 imageView 来避免这个问题。

这是我的适配器的代码。

公共类 FullScreenImageViewAdapter 扩展 PagerAdapter {

private final Activity          _activity;
private final ArrayList<String> _imagePaths;

// constructor
public FullScreenImageViewAdapter(Activity activity,
        ArrayList<String> imagePaths)
{
    this._activity = activity;
    this._imagePaths = imagePaths;
}

@Override
public int getCount()
{
    return this._imagePaths.size();
}

@Override
public boolean isViewFromObject(View view, Object object)
{
    return view == ((RelativeLayout) object);
}

@Override
public Object instantiateItem(ViewGroup container, int position)
{
    LayoutInflater inflater = (LayoutInflater) _activity
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View viewLayout = inflater.inflate(R.layout.img_view, container, false);

    TouchImageView imgDisplay = (TouchImageView) viewLayout
            .findViewById(R.id.imgDisplay);

    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPreferredConfig = Bitmap.Config.ARGB_8888;
    Bitmap bitmap = BitmapFactory.decodeFile(_imagePaths.get(position),
            options);

    imgDisplay.setImageBitmap(bitmap);
    ((ViewPager) container).addView(viewLayout);

    return viewLayout;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object)
{
    ((ViewPager) container).removeView((RelativeLayout) object);

}

}

【问题讨论】:

  • 你用的是什么图片? png 还是 jpeg?
  • 我用的是JPG手机拍照图片

标签: android


【解决方案1】:

使用位图选项压缩您的图像并在样本大小检查此链接

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

【讨论】:

    【解决方案2】:

    内存限制总是很难解决。

    如果二次采样不适用,您可以尝试通过更改原始 ImageView(可能是 ViewPager 或两者)来按需加载图像以检查其可见性,如果不可见则丢弃未压缩的图像数据,如果可见则解码回。为了提高速度,您可以将压缩图像存储在内存中,按需解码。

    【讨论】:

      【解决方案3】:

      由于您的图像是 JPEG,您可以使用 RGB_565 格式,因为您不需要显示带有 alpha 通道的图像(如 png)。

      options.inPreferredConfig = Bitmap.Config.RGB_565;
      

      这将导致您的图像需要和使用更少的内存,因为每个像素是 2 个字节(而不是 ARGB_8888 中的 4 个字节)

      更多信息:http://developer.android.com/reference/android/graphics/Bitmap.Config.html

      【讨论】:

      • 占用 19,660,800 字节的 smoeth 现在将占用大约一半 (9,830,400)
      • 我用 3MB 的图片测试了这个解决方案,效果很好,但是 10MB 的图片呢??
      • 图像使用的内存量取决于使用的 inPreferredConfig 值及其包含的像素数。查看更多信息链接。
      猜你喜欢
      • 1970-01-01
      • 2012-12-28
      • 2015-01-08
      • 1970-01-01
      • 1970-01-01
      • 2016-08-10
      • 2012-08-27
      • 1970-01-01
      • 2011-04-27
      相关资源
      最近更新 更多