2

怎么了伙计们。

我正在尝试制作产品目录,这就是我正在做的事情:

  • ViewPager 的活动——每个产品都是这个 ViewPager 中的一个片段。-- 每个片段都有一个画廊。

我从网上下载产品数据和图像并将图像存储到 SD 卡中。

但是我的应用程序不断崩溃,这是错误

05-22 10:04:43.829: E/AndroidRuntime(12388): FATAL EXCEPTION: main
05-22 10:04:43.829: E/AndroidRuntime(12388): java.lang.OutOfMemoryError
05-22 10:04:43.829: E/AndroidRuntime(12388):    at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
05-22 10:04:43.829: E/AndroidRuntime(12388):    at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:493)
05-22 10:04:43.829: E/AndroidRuntime(12388):    at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:299)
05-22 10:04:43.829: E/AndroidRuntime(12388):    at android.graphics.BitmapFactory.decodeFile(BitmapFactory.java:324)

我在 Gallery 的 Adapter 上的 getView 中使用了 de bitmap factory,但是当我滑动 Fragments 时它崩溃了。然后我在创建主活动时更改并创建并列出,但现在如果我关闭活动并尝试再次打开它,它会崩溃,然后如果我尝试再次打开它会正常打开。

我做错了什么?有更好的方法吗?

这是我的画廊适配器

public class ImagemAdapter extends BaseAdapter {

        private Context ctx;
        List<Bitmap> pics;

        public ImagemAdapter(Context c, List<Bitmap> pics) {
            ctx = c;
            this.pics = pics;
        }

        @Override
        public int getCount() {

            return pics.size();
        }

        @Override
        public Object getItem(int position) {
            return pics.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent){
            if(convertView == null){
                int arquivoLayout = R.layout.adp_galeria;
                LayoutInflater inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = inflater.inflate(arquivoLayout, null);
                ImageView img = ((ImageView)convertView.findViewById(R.id.imgProd));            
                img.setImageBitmap(pics.get(position));
            }
            return convertView;
        }

}

另一个奇怪的是,适配器上的 convertView 总是为空。

编辑:

我认为问题在于位图保留在内存中。当调用 Fragment 的 onCreateView 时,我用应该显示的图像填充一个列表,当调用 Fragment 的 onDestroyView 时,我这样做:

for(int i =0; i< imagemBit.size(); i++){
    Bitmap bmp = imagemBit.get(i);
    bmp.recycle();
    bmp = null;
}
imagemBit.clear();

但是:当我再次尝试填充列表时再次调用 onCreateView(用户返回到上一页)时,应用程序崩溃并出现 OutOfMemory 异常。

4

2 回答 2

2

请看这个答案
我在下载和显示许多缓存在内存中的图像时遇到了同样的问题。确保不超过一定数量的图像(取决于大小)留在内存中。

于 2013-05-22T19:58:25.990 回答
1

您的应用程序在您的代码中崩溃的地方?

我认为在您关闭应用程序后,“图片”仍然保留对位图的引用,这就是 GC 不释放位图的原因。您必须在应用停止时或在创建新位图之前释放位图。

于 2013-05-22T13:50:03.903 回答