4
public View getView(final int position, View convertView, ViewGroup parent) {
    SectionHolder sectionHolder = null;
    ViewHolder holder = null;
    convertView = listAdapter.getView(getIndexForPosition(position),
                convertView, parent);
    convertView.setTag(contactsIds[getIndexForPosition(position)]);
    holder = new ViewHolder();
    holder.txtTitle = (TextView) convertView
                .findViewById(R.id.list_item_title);
    holder.id = contactsIds[getIndexForPosition(position)];
    new ThumbnailTask(holder,contactsIds[getIndexForPosition(position)]).execute();
    return convertView;
}

private class ThumbnailTask extends AsyncTask<Void, Void, Integer> {
    private String mId;
    private ViewHolder mHolder;
    public ThumbnailTask(ViewHolder holder, String id) {
        mId = id;
        mHolder = holder;
    }

    @Override
    protected Integer doInBackground(Void... params) {
        // TODO Auto-generated method stub
        int drawableId = getContactStatus(mHolder.id);
        // Log.i("DRAWABLE",drawableId+"");
        return drawableId;
    }

    protected void onPostExecute(Integer drawableId) {
        if (mHolder.id.equals(mId)) {
            if (drawableId != 0) {
                if (UpdateStatusService.user == 1) {
                    mHolder.txtTitle.setCompoundDrawablesWithIntrinsicBounds(0, 0,drawableId, 0);
                } else {
                    mHolder.txtTitle.setCompoundDrawablesWithIntrinsicBounds(0, 0,R.drawable.ic_action_quetion, 0);
                }
            } else {
                    mHolder.txtTitle.setCompoundDrawablesWithIntrinsicBounds(0,0, android.R.color.transparent, 0);
            }
        }
    }
}
static class ViewHolder {
    public TextView txtTitle;
    public String id;
}

これは、リストビューのgetViewへのアダプタの私のコードです。

ListViewAndroidからの連絡先のリストが含まれています。

しかし、私はjava.util.concurrent.RejectedExecutionException を取得しています。非同期タスクは基本的にサーバーから画像を取得し、サーバーデータと一致する番号があれば、それ以外の場合は設定する1つの画像が含まれます。

では、この例外を回避するにはどうすればよいですか?

4

1 に答える 1

10

AsyncTaskスレッドはワークキューに配置されます。そのワークキューは、インスタンス化できるスレッドの数を制限します。最大値を超えると、が表示されますRejectedExecutionException

解決策は、コードをリファクタリングしてスレッドをインスタンス化しないgetView()ようにするか、現在の行のスレッドがすでに開始されているかどうかを制御するチェックを行うことです。getView()は非常に頻繁に呼び出されるため、スレッドが現在行で実行されているかどうかを確認しないと、最終的に許可されたスレッドの数を超えることになります。

ダウンロードリンク:https ://www.dropbox.com/s/pvr9zyl811tfeem/ListViewImageCache.zip

于 2012-08-22T14:22:26.303 に答える