Android实战简单新闻客户端(7)---图片加载过多导致的Fatal signal 11 (SIGSEGV)

说明

文章首发于HURUWO的博客小站,本平台做同步备份发布。

如有浏览或访问异常图片加载失败或者相关疑问可前往原博客下评论浏览。

原文链接 安卓实战简单新闻客户端7直接点击即可前往访问。

更多技术文章访问本人博客HuRuWo的技术小站,包括Android 逆向 app,闲鱼爬虫 微信爬虫 抖音爬虫 群控 等相关知识

问题描述:

在尝试下拉加载更多的时候,前面几次都能正常加载。但是到第五次的时候开始出现Fatal signal 11 (SIGSEGV) at 0x000007c4 (code=1),并退出了程序。

经过查询Fatal signal 11 (SIGSEGV) at 0x000007c4 (code=1)是指程序访问了私有的内存地址,也就是内存泄露。

OOM是导致Fatal signal 11 (SIGSEGV) at 0x000007c4 (code=1)的一种原因。到底是不是还需要验证一下。

问题验证:

通过去除显示图片的控件,既listview item不加载图片后。程序运行正常,不会导致Fatal signal 11 (SIGSEGV) at 0x000007c4 (code=1)

由此证明是异步图片加载控件过多,导致OOM。
具体参考:Fatal signal 11 (SIGSEGV) at 0x000007c4 (code=1)

问题解决:

全局只需要一个RequestQueue和 ImageLoader ,之前的每一个NetworkImageView都开了一个RequestQueue和 ImageLoader,导致OOM。只需要移出来即可。

public class NewAdapter extends ArrayAdapter<News> {

    //全局定义一个即可,volley建议定义在baseactivity里面
    RequestQueue mQueue = Volley.newRequestQueue(getContext());
    ImageLoader imageLoader = new ImageLoader(mQueue, new ImageLoader.ImageCache() {
        @Override
        public void putBitmap(String url, Bitmap bitmap) {
        }
        @Override
        public Bitmap getBitmap(String url) {
            return null;
        }
    });

    private int resourceID;

    public NewAdapter(Context context, int textviewresourceid, List<News> object) {
        super(context, textviewresourceid, object);
        resourceID = textviewresourceid;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        News news = getItem(position);//获取当前项的wanwan实例
        View view;
        ViewHolder viewHolder;
        if (convertView == null) {
            view = LayoutInflater.from(getContext()).inflate(resourceID, null);//获取view实例
            viewHolder = new ViewHolder();
            viewHolder.networkImageView=(NetworkImageView) view.findViewById(R.id.news_pic);
            viewHolder.textView1 = (TextView) view.findViewById(R.id.text_title);
            viewHolder.textView2 = (TextView) view.findViewById(R.id.text_content);
            view.setTag(viewHolder);
        } else {
            view = convertView;
            viewHolder = (ViewHolder) view.getTag();
        }


        viewHolder.textView1.setText(news.getTitle());
        viewHolder.textView2.setText(news.getDescription());
        Log.d("PIC", news.getPicurl());
//        RequestQueue mQueue = Volley.newRequestQueue(getContext());
//        ImageLoader imageLoader = new ImageLoader(mQueue, new ImageLoader.ImageCache() {
//            @Override
//            public void putBitmap(String url, Bitmap bitmap) {
//            }
//            @Override
//            public Bitmap getBitmap(String url) {
//                return null;
//            }
//        });
        viewHolder.networkImageView.setDefaultImageResId(R.mipmap.ic_launcher);
        viewHolder.networkImageView.setErrorImageResId(R.mipmap.ic_launcher);
        viewHolder.networkImageView.setImageUrl(news.getPicurl(),
                imageLoader);
        return view;
    }

    class ViewHolder {
        TextView textView1;
        TextView textView2;
        NetworkImageView networkImageView;
    }
}

这样这个demo就算告一段落,下载地址:
https://github.com/HuRuWo/SimpleNews/tree/e322fefc6cdd6560c2bf5e825c3a6d1f114a9a0f

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值