Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.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 ViewPager错误(VM不允许我们分配)_Android - Fatal编程技术网

Android ViewPager错误(VM不允许我们分配)

Android ViewPager错误(VM不允许我们分配),android,Android,我有一个显示图像的问题,我用三星Galaxy Captivate i897测试我的程序,所以,问题是我想显示图像,我用一个ViewPager来做这件事,但是ViewPager总是实例化三个图像(方法实例化Item),在图像之前、显示和之后,我的图像都是5MB,所以LogCat给了我这个错误 01-29 11:35:48.656:E/dalvikvm堆(1275):19660800字节的外部分配对此进程太大。 01-29 11:35:48.679:E/GraphicsJNI(1275):虚拟机不允

我有一个显示图像的问题,我用三星Galaxy Captivate i897测试我的程序,所以,问题是我想显示图像,我用一个ViewPager来做这件事,但是ViewPager总是实例化三个图像(方法实例化Item),在图像之前、显示和之后,我的图像都是5MB,所以LogCat给了我这个错误

01-29 11:35:48.656:E/dalvikvm堆(1275):19660800字节的外部分配对此进程太大。 01-29 11:35:48.679:E/GraphicsJNI(1275):虚拟机不允许我们分配19660800字节

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

这是我的适配器代码

公共类FullScreenImageViewAdapter扩展了PagerAdapter {

私人最终活动\u活动;
私有最终数组列表_imagepath;
//建造师
公共FullScreenImageViewAdapter(活动,
ArrayList图像路径)
{
这个。_活动=活动;
这是。_imagepath=imagepath;
}
@凌驾
public int getCount()
{
返回此项。_imagepath.size();
}
@凌驾
公共布尔值isViewFromObject(视图,对象)
{
返回视图==((RelativeLayout)对象);
}
@凌驾
公共对象实例化项(视图组容器,int位置)
{
LayoutInflater充气机=(LayoutInflater)\u活动
.getSystemService(上下文布局\充气机\服务);
视图布局=充气机。充气(R.layout.img_视图,容器,假);
TouchImageView imgDisplay=(TouchImageView)视图布局
.findviewbyd(R.id.imgDisplay);
BitmapFactory.Options=new-BitmapFactory.Options();
options.inPreferredConfig=Bitmap.Config.ARGB_8888;
位图位图=位图工厂.decodeFile(_imagepath.get(位置),
选择权);
设置图像位图(位图);
((ViewPager)容器)。添加视图(viewLayout);
返回视图布局;
}
@凌驾
公共项(视图组容器、int位置、对象)
{
((ViewPager)容器)。移除视图((RelativeLayout)对象);
}

}

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


内存限制总是很难解决


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

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

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


更多信息:

您使用的图像是什么?png或jpeg?Im使用JPG手机摄像头图片使用19660800字节的smoething,现在大约需要(9830400)的一半。我用3MB图像测试了此解决方案,效果很好,但10MB图像如何?图像使用的内存量取决于使用的inPreferredConfig值及其包含的像素数。请参阅更多信息链接。
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);

}
options.inPreferredConfig = Bitmap.Config.RGB_565;