0

Asynctask の doInBackground メソッドで例外が発生しました。カスタム アダプタを使用してフィルタリングを実行しています。このフィルタリングを Asycntask で実行したいのですが、コードは Asynctask なしで完全に実行されていますが、フィルタリングを実行するには 3 ~ 4 秒かかります。そのため、Asynctask を使用したいと考えています。これが私のコードです...

public FarmerAdapter(Context context, int textViewResourceId,
        List<Farmer> objects) {
    super(context, textViewResourceId, objects);

    this.items = (ArrayList<Farmer>) objects;
    this.itemsAll = (ArrayList<Farmer>) items.clone();
    this.suggestions = new ArrayList<Farmer>();
    this.CurrentContext = context;

}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if ((this.items == null) || (position + 1 > this.items.size()))
        return convertView;

    this.CurrentItem = ((Farmer) this.items.get(position));

    LayoutInflater vi = (LayoutInflater) CurrentContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    convertView = vi.inflate(R.layout.farmer_list_adapter, null);

    TextView name = (TextView) convertView
            .findViewById(R.id.farmer_list_name);
    TextView fname = (TextView) convertView
            .findViewById(R.id.farmer_list_fname);
    TextView cnic = (TextView) convertView
            .findViewById(R.id.farmer_list_cnic);

    name.setText(this.CurrentItem.getFarmerName());
    fname.setText(this.CurrentItem.getFarmerFatherName());
    cnic.setText("" + this.CurrentItem.getFarmerCNIC());

    return convertView;
}

public Filter getFilter() {

    backgroundTask = new AsyncTask<Void, Void, Void>() {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Log.e("AsynTask", " Started");
        }

        @Override
        protected Void doInBackground(Void... params) {
            nameFilter = new Filter() {

                public String convertResultToString(Object resultValue) {
                    String str = ((Farmer) (resultValue)).getFarmerName();
                    return str;
                }

                @Override
                protected void publishResults(CharSequence constraint,
                        FilterResults results) {

                    ArrayList<Farmer> filteredList = (ArrayList<Farmer>) results.values;
                    ArrayList<Farmer> farmerList = new ArrayList<Farmer>();
                    if (results != null && results.count > 0) {
                        clear();
                        for (Farmer f : filteredList) {
                            farmerList.add(f);
                        }
                        Iterator<Farmer> customerIterator = farmerList.iterator();
                        while (customerIterator.hasNext()) {
                            Farmer fiterator = customerIterator.next();
                            add(fiterator);
                        }
                        notifyDataSetChanged();
                    }
                }

                @Override
                protected FilterResults performFiltering(CharSequence constraint) {

                    if (constraint != null) {
                        suggestions.clear();
                        for (Farmer farmer : itemsAll) {
                            if (farmer.getFarmerName().toLowerCase()
                                    .startsWith(constraint.toString().toLowerCase())) {
                                suggestions.add(farmer);
                            }
                        }
                        FilterResults filterResults = new FilterResults();
                        filterResults.values = suggestions;
                        filterResults.count = suggestions.size();
                        return filterResults;
                    } else {
                        return new FilterResults();
                    }
                }

            };


            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            Log.e("AsynTask", " Ended");
        }

    }.execute();

    return nameFilter;
};

この問題に関して私を助けてください。

4

3 に答える 3

1

Asycntask を削除して、performFiltering で直接ジョブを実行してください。

複雑さを 1 レベル追加するだけで検索速度が上がるとは思わない

于 2013-06-25T07:06:32.233 に答える
1

doInBackground()メソッドで UI の変更を更新することはできません。

onPostExecute()メソッドを使用して、UI の変更を更新します。

onPostExecute は doInBackground メソッドの後に呼び出されます。

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        notifyDataSetChanged();
        Log.e("AsynTask", " Ended");
    }
于 2013-06-25T06:13:15.733 に答える