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

问题描述:

在尝试下拉加载更多的时候,前面几次都能正常加载。但是到第五次的时候开始出现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

发布了85 篇原创文章 · 获赞 40 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/lw_zhaoritian/article/details/52787358