0

ヘルプ - 関連するすべてのスレッドを読んでください。私の onPostExecute は呼び出されていません。

AsyncTask を使用して別のスレッドでリスト ビルダーを実行することにより、AutoCompleteTextView のオートコンプリート リストを動的に作成しようとしています。

これが基本的なコードです....何かアイデアはありますか?

  _artist = (AutoCompleteTextView)findViewById(R.id.artist);  
  _artist.addTextChangedListener(new TextWatcher() 
    {
        public void afterTextChanged(Editable s) 
        {
            _artist.setAdapter(null);
            _fetcher = new AutoCompleteFetcher(_artist);
            _fetcher.execute();        
        }
    }

    public class AutoCompleteFetcher extends AsyncTask<Void, Void, Void> 
    {       
        private AutoCompleteTextView _textView;
        private String[] _matches;

        public AutoCompleteFetcher(AutoCompleteTextView v) 
        {
            super();
            _textView = v;
        }

        protected Void doInBackground(Void... v)
        {   
            _matches = _getMatches();               
            return null;
        }

        private String[] _getMatches()
        {   
            // fill the list....... code removed here
            // returns populated String[]
        }

        @Override
        protected void onPostExecute(Void result) 
        {   
            ArrayAdapter<String> adapter = 
                    new ArrayAdapter<String>(_textView.getContext(),
                        android.R.layout.simple_list_item_1,_matches);
            _textView.setAdapter(adapter);
        }
}
4

1 に答える 1

0

あなたのコードは大丈夫だと思っていたでしょうが、このスレッドを見ると、そうではないかもしれません。Android の一部のバージョンでは、このケースが想定どおりに処理されない可能性があります。

AsyncTaskとにかく、問題は、ジェネリックパラメーターを all として宣言することだと思いますVoid。タスクが何らかの結果を生成し、その結果が に渡されるという考えが想定されていると思いますonPostExecute()。バックグラウンド処理の結果をからに渡すためにメンバー変数_matchesを使用しているようです。Android の設計者は、これを実現するために の値とパラメータを使用することを意図していたと思います。doInBackGround()onPostExecute()returndoInBackground()onPostExecute()

したがって、代わりにこれを試してください:

public class AutoCompleteFetcher extends AsyncTask<Void, Void, String[]> 
{       
    private AutoCompleteTextView _textView;

    public AutoCompleteFetcher(AutoCompleteTextView v) 
    {
        super();
        _textView = v;
    }

    @Override
    protected String[] doInBackground(Void... v)
    {   
        return _getMatches();               
    }

    private String[] _getMatches()
    {   
        // fill the list....... code removed here
        // returns populated String[]
        // TODO: it seems like this method should really just be moved into 
        //  doInBackground().  That said, I don't think this is your problem.
    }

    @Override
    protected void onPostExecute(String[] result) 
    {   
        ArrayAdapter<String> adapter = 
                new ArrayAdapter<String>(_textView.getContext(),
                    android.R.layout.simple_list_item_1, result);
        _textView.setAdapter(adapter);
    }
}
于 2012-07-16T09:13:26.813 に答える