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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章