滚动速度非常快时,ListView会导致致命错误

时间:2013-10-21 20:22:01

标签: listview android-asynctask

我遇到导致我的应用崩溃的ListView问题。整个应用程序不会崩溃,它只是关闭视图并重新加载主要活动。看起来效果很好,当滚动速度很快时,它基本上是稳定的。但是如果我使用快速滚动几次向上和向下滚动屏幕将冻结,它将重新加载主要活动。有人能帮我找到问题所在吗?这是我崩溃时从LogCat收到的错误:

Fatal signal 11 (SIGSEGV) at 0xdeadbaad (code=1), thread 12439 (AsyncTask #4)

以下是我的代码:

getView()方法

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = new ViewHolder();
        View vi = convertView;
        if (convertView == null) {
            vi = inflater.inflate(R.layout.custom_layout, null);
            vi.setMinimumHeight(120);

            holder = new ViewHolder(); 
            holder.text = (TextView) vi.findViewById(R.id.text);
            holder.icon= (ImageView) vi.findViewById(R.id.icon);

            vi.setTag(holder);
        }

        holder = (ViewHolder) vi.getTag();
        holder.position = kanji_ids.get(position);
        holder.context = vi.getContext();
        new DownloadAsyncTask().execute(holder);
        return vi;
    }

这是获取数据并显示它的AsyncTask ......

class DownloadAsyncTask extends AsyncTask<ViewHolder, Void, ViewHolder> {
    String icon;
    String text;

    @Override
    protected ViewHolder doInBackground(ViewHolder... params) {
        ViewHolder viewHolder = params[0];
        Context context = viewHolder.context;
        Database db = Database.getInstance(context);
        text = db.getPercentByPosition(viewHolder.position);
        icon = db.getIconByPosition(viewHolder.position);

        return viewHolder;
    }

    @Override
    protected void onPostExecute(ViewHolder result) {
        if (result.icon == null) {
            result.icon.setImageResource(R.drawable.loading);
        } else {
            result.icon.setImageResource(icon);
        }

        result.text.setText(text);

    }
}

1 个答案:

答案 0 :(得分:0)

这可能是因为图标不再可见,并且当您滚动时该视图被重新用于新行。您应该使用WeakReferences并检查viewHolder或图标是否为空,如果是,您可以放弃更改。同样适用于文本。