qq_35071078
下课睡觉
2016-12-02 08:54
采纳率: 45.7%
浏览 1.3k

android ListView一直添加数据导致OOM怎么办?

        给listView设置了下拉刷新,但是发现如果我一直刷新,一直添加数据的话,内存使用会越来越大,最后导致OOM?怎么解决啊?
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

4条回答 默认 最新

  • qq_34994609
    xiao小小宁 2016-12-02 09:56
    已采纳

    使用viewHolder了吗?数据是网络访问的吗?如果是访问网络的数据,使用框架啊,缓存问题不用自己写了,不用框架,写个三级缓存麻烦死。

    点赞 评论
  • lxj1137800599
    勇敢地追 2016-12-02 09:14

    那你要分清楚OOM的原因啊,比如说是因为bitmap。那么可以考虑从inSampleSize方面或者缓存方面去考虑

    点赞 评论
  • qq_35071078
    下课睡觉 2016-12-03 02:45

    public class ClubMemberAdapter extends BaseAdapter {
    private DrawableAndString dAS;//将16进制字符串转换为drawable的类
    private boolean hasButton = false;//是否可以有button按钮,领队才有
    private LayoutInflater mInflater;
    private Context context;
    public LinkedList list = new LinkedList<>();

    public ClubMemberAdapter(LinkedList<ClubMembers> list, Context context, boolean hasButton) {
        this.list =  list;
        this.context = context;
        this.mInflater = LayoutInflater.from(context);
        this.hasButton = hasButton;
        dAS = new DrawableAndString();
    }
    
    @Override
    public int getCount() {
        return list.size();
    }
    
    
    @Override
    public Object getItem(int position) {
        return list.get(position);
    }
    
    
    @Override
    public long getItemId(int position) {
        return 0;
    }
    
    
    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.item_clubmember, null);
            viewHolder = new ViewHolder();
            viewHolder.img = (XCRoundImageView) convertView.findViewById(R.id.roundImg_clubMM);
            viewHolder.txt_name = (TextView) convertView.findViewById(R.id.id_txt_clubMM_name);
            viewHolder.txt_position = (TextView) convertView.findViewById(R.id.id_txt_clubMM_position);
            viewHolder.txt_worth = (TextView) convertView.findViewById(R.id.id_txt_cluMM_worth);
            viewHolder.btn = (Button) convertView.findViewById(R.id.id_btn_clubMM);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        if (hasButton) {
            //判断是否应该有Button,因为项目里有两种角色。
            viewHolder.btn.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                }
            });
        } else {
            viewHolder.btn.setVisibility(View.INVISIBLE);
        }
        viewHolder.img.setImageDrawable(dAS.byteToDrawable(list.get(position).getPhoto()));//解析图片
        viewHolder.txt_name.setText(list.get(position).getPlayerID());
        viewHolder.txt_position.setText(list.get(position).getName());
        viewHolder.txt_worth.setText(list.get(position).getWorth().getArena_worth() + "(" + list.get(position).getWorth().getArena_Name() + ")");
        convertView.setTag(viewHolder);
        return convertView;
    }
    
    class ViewHolder {
        XCRoundImageView img;
        TextView txt_name;
        TextView txt_position;
        TextView txt_worth;
        Button btn;
    }
    

    }

    点赞 评论
  • EX_Cj
    有生之莲萨摩耶 2017-04-19 08:37

    你这个有设置缓存吗?如果list内存过大的话,是可以通过缓存图片到本地(Sd卡),这样的话内存消耗就不会过大了。
    我看了一下你回答,list建议设置在20条左右,然后你可以通过下拉到底部在加载。50确实是有点多

    点赞 评论

相关推荐