ViewPager错误(VM不会让我们分配)

时间:2014-01-29 16:58:02

标签: android

我有一个显示图像的问题,我用三星Galaxy Captivate i897测试我的程序,所以,问题是我想显示图像,我用ViewPager做这个,但ViewPager实例化总是三个图像(方法instantiateItem),之前,显示和之后的图像,我的图像都是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);

}

}

3 个答案:

答案 0 :(得分:1)

使用位图选项压缩图像并对示例大小检查此链接

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

答案 1 :(得分:0)

内存限制总是难以解决。

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

答案 2 :(得分:0)

由于您的图像是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