首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BitmapFactory OutOfMemory

BitmapFactory OutOfMemory
EN

Stack Overflow用户
提问于 2013-05-22 13:22:29
回答 2查看 664关注 0票数 2

大家好啊。

我试图制作一个产品目录,这就是我要做的:

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

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

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

代码语言:javascript
复制
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)

我在图片库适配器上的getView中使用de位图工厂,但当我滑动片段时,它就崩溃了。然后,我更改并创建并列出了主活动创建的时间,但是现在如果我关闭该活动并再次尝试打开它,它就会崩溃,如果我试图再次打开它,它就会正常打开。

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

这是我的图片库适配器

代码语言:javascript
复制
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总是空的。

编辑:

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

代码语言:javascript
复制
for(int i =0; i< imagemBit.size(); i++){
    Bitmap bmp = imagemBit.get(i);
    bmp.recycle();
    bmp = null;
}
imagemBit.clear();

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-22 19:58:25

请看this answer

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

票数 2
EN

Stack Overflow用户

发布于 2013-05-22 13:50:03

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

我认为在你关闭你的应用程序后,'pics‘仍然保留对位图的引用,这就是为什么GC不发布位图的原因。您必须在应用程序停止时或在创建新位图之前发布位图。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16692952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档