0

我正在尝试制作一个片段,该片段将使用 TouchImageView(https://github.com/MikeOrtiz/TouchImageView)显示可缩放图像

该片段还有一个用于更改图像的微调器。问题是第一个图像加载正常,但是当我使用滚动条更改图像时,我得到一个 OutOfMemoryError 并且程序崩溃。这是我的代码

public class mapFragment extends SherlockFragment {


String[] Levels = { "Ground Floor", "First Floor",
        "Second Floor", "Third Floor"
};

Button button;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup group, Bundle saved)
{
    View v = inflater.inflate(R.layout.maps_layout, group, false);


    final TouchImageView img = (TouchImageView) v.findViewById(R.id.touchimage1);
    final Bitmap snoop = BitmapFactory.decodeResource(getResources(), R.drawable.groundfloor);
    img.setImageBitmap(snoop);




    final Spinner s = (Spinner) v.findViewById(
            R.id.spinnerlevels);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this
            .getActivity().getBaseContext(),
            android.R.layout.simple_spinner_item, Levels);
    s.setAdapter(adapter);

    s.setOnItemSelectedListener(new OnItemSelectedListener() {

        public void onItemSelected(AdapterView<?> parent, View view, 
                int pos, long id) {
            // An item was selected. You can retrieve the selected item using
            // parent.getItemAtPosition(pos)
            int item = s.getSelectedItemPosition();



            if(item ==0){
                snoop.recycle();
                Bitmap snoop = BitmapFactory.decodeResource(getResources(), R.drawable.groundfloor);
                img.setImageBitmap(snoop);
            }
            if(item ==1){
                snoop.recycle();
                Bitmap snoop = BitmapFactory.decodeResource(getResources(), R.drawable.firstfloor);
                img.setImageBitmap(snoop);
            }
            if(item ==2){
                snoop.recycle();
                Bitmap snoop = BitmapFactory.decodeResource(getResources(), R.drawable.secondfloor);
                img.setImageBitmap(snoop);
            }
            if(item ==3){
                snoop.recycle();
                Bitmap snoop = BitmapFactory.decodeResource(getResources(), R.drawable.thirdfloor);
                img.setImageBitmap(snoop);
            }


        }

        public void onNothingSelected(AdapterView<?> parent) {
            // Another interface callback
        }
    });



    img.setMaxZoom(8f);

    return (v);


}

}

“recylce()”不应该删除第一个图像,让位于内存中的新图像吗?以 MB 为单位的图像大小为 1.4、1.5、1.5、1.3

4

2 回答 2

1

“recylce()”不应该删除第一个图像,让位于内存中的新图像吗?

不,recycle() 方法只是将此位图标记为“已死”,并且稍后可以将其作为垃圾回收。这是recycle()方法的文档:

释放与此位图关联的本机对象,并清除对像素数据的引用。这不会同步释放像素数据;如果没有其他引用,它只是允许它被垃圾收集。该位图被标记为“死”,这意味着如果调用 getPixels() 或 setPixels() 将引发异常,并且不会绘制任何内容。此操作无法反转,因此只有在您确定位图没有进一步用途时才应调用它。这是一个高级调用,通常不需要调用,因为当没有更多对该位图的引用时,正常的 GC 进程将释放该内存。

于 2012-08-31T11:31:26.457 回答
0

对于图像的每个像素,您的堆使用 8 个字节。现在 1754 x 2481 x 8 有多少内存?答案是 32.94 MB 的堆内存。在许多设备上,您不会拥有超过 16 MB 的堆,这些堆也用于其他东西。你现在明白你的问题了吗?

您需要使图像更小,否则您的应用程序将永远无法运行:)

于 2012-08-31T11:54:43.077 回答