【问题标题】:OutofMemoryException thrown while scrolling a ListView滚动 ListView 时抛出 OutofMemoryException
【发布时间】:2012-08-17 04:31:52
【问题描述】:

如果我们快速滚动Listview,应用会抛出致命异常OutofMemoryError

滚动时总是出现同样的错误。如何处理?

public class UpcomingAdapter extends BaseAdapter{
    Typeface typeFace;
    private ArrayList<String> mEventName,mDate,mTime;
    private LayoutInflater mInflater;

    public UpcomingAdapter(LayoutInflater mInflater,
                           ArrayList<String> mDEventName,
                           ArrayList<String> mDdate,
                           ArrayList<String> mDtime,
                           Typeface typeface)
    {
        this.mEventName=mDEventName;
        this.mDate=mDdate;
        this.mTime=mDtime;       
        this.mInflater=mInflater;
        this.typeFace=typeface;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int arg0, View view, ViewGroup parent) {
        ViewHolder holder = null;

        if(view==null) {
            holder=new ViewHolder();
            view=mInflater.inflate(R.layout.upcomingevent_list,null);
            view.setTag(holder);
            holder=(ViewHolder) view.getTag();
            holder.holderDate=(TextView)view.findViewById(R.id.xTvUpcomingEvents_DateList);
            holder.holderEventName=(TextView)view.findViewById(R.id.xTvUpcomingEvents_Events);
            holder.holderEventName.setTypeface(typeFace);
            holder.holderDate.setTypeface(typeFace);
        } else {
            holder=(ViewHolder) view.getTag();  
        }

        //holder.employeeName.setTag(mEmpIds.get(arg0));
        setText(mEventName.get(arg0), holder.holderEventName);
        setText(mDate.get(arg0), holder.holderDate);
        setText(mTime.get(arg0), holder.holderEventName);

        holder.holderEventName.setTag(mEventName.get(arg0));
        holder.holderEventName.setTypeface(typeFace);

        //holder.holderArtistId.setTypeface(typeFace);

        return view;
    }

    public static class ViewHolder{
        TextView holderEventName;
        TextView holderDate;

        //TextView holderArtistId;
    }

    private void setText(String data,TextView view){
        if(data.equals(StaticUtils.sNullString)){
            view.setText(StaticUtils.sEmptyString);
        } else {
            view.setText(data);
        }
    }
}

这是错误:

08-17 15:08:22.950: E/AndroidRuntime(25423): FATAL EXCEPTION: main
08-17 15:08:22.950: E/AndroidRuntime(25423): java.lang.OutOfMemoryError: [memory exhausted]
08-17 15:08:22.950: E/AndroidRuntime(25423):    at dalvik.system.NativeStart.main(Native Method)

【问题讨论】:

    标签: android android-listview out-of-memory fatal-error


    【解决方案1】:

    在您的 getView 方法中尝试:

    @Override
        public View getView(int arg0, View view, ViewGroup parent) {
    
    
            if(view==null) {
                LayoutInflater layoutInflater=LayoutInflater.from(getContext());
                view=layoutInflater.inflate(R.layout.upcomingevent_list, parent, false);
                holder=new ViewHolder();
                holder.holderDate=(TextView)view.findViewById(R.id.xTvUpcomingEvents_DateList);
                holder.holderEventName=(TextView)view.findViewById(R.id.xTvUpcomingEvents_Events);
                holder.holderEventName.setTypeface(typeFace);
                holder.holderDate.setTypeface(typeFace);
                view.setTag(holder);
            } else {
                holder=(ViewHolder) view.getTag();  
            }
    
            //holder.employeeName.setTag(mEmpIds.get(arg0));
            setText(mEventName.get(arg0), holder.holderEventName);
            setText(mDate.get(arg0), holder.holderDate);
            setText(mTime.get(arg0), holder.holderEventName);
    
            holder.holderEventName.setTag(mEventName.get(arg0));
            holder.holderEventName.setTypeface(typeFace);
    
            //holder.holderArtistId.setTypeface(typeFace);
    
            return view;
        }
    

    【讨论】:

      【解决方案2】:

      您还可以覆盖 onLowMemory() 方法,并在活动检测到内存不足时运行垃圾收集器。 您可以使用 System.gc()。同时在此方法中取消不需要的变量。

      【讨论】:

        【解决方案3】:

        用您现有的代码替换下面的方法。

           @Override
                public int getItem(int position) {
                    return <Return Particular int variable from Data>;
                }
        
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return <Return Particular int variable from Data>;
        }
        
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return <Return Particular int variable from Data>;
        }
        

        【讨论】:

        • 您的回答绝对错误,因为您说从您的角度来看,所有内容都返回相同的int variable
        猜你喜欢
        • 2015-02-28
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-08
        • 2016-04-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多