Асинхронная задача: onPostExecute

Помогите - прочитайте все соответствующие темы, но мой onPostExecute не вызывается.

Я пытаюсь динамически создать список автозаполнения для AutoCompleteTextView, запустив построитель списка в отдельном потоке с помощью AsyncTask.

Вот основной код... есть идеи?

  _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);
        }
}

person milleph    schedule 14.07.2012    source источник
comment
Почему вы не возвращаете результаты getMatches() в onPostExecute(), а затем не назначаете их там _matches?   -  person nkr    schedule 14.07.2012
comment
правда, я мог бы это сделать, но проблема в том, что onPostExecute никогда не вызывается. Я только что прочитал в другом месте, что AutoCompleteTextView использует AsyncTask внутри, так что это плохая идея... возможно, это проблема?   -  person milleph    schedule 14.07.2012


Ответы (1)


Я бы подумал, что ваш код в порядке, но если вы посмотрите на эту ветку, возможно, нет. Потенциально некоторые версии Android не обрабатывают этот случай должным образом.

В любом случае, я думаю, проблема может заключаться в том, что вы объявляете свои AsyncTask общие параметры как все Void. Я думаю, что идея должна заключаться в том, что задача производит какой-то результат, и этот результат передается onPostExecute(). Похоже, вы используете переменную-член _matches для передачи результата фоновой работы из doInBackGround() в onPostExecute(). Я думаю, что разработчики Android хотели, чтобы вы использовали значение return для doInBackground() и параметр 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);
    }
}
person Nate    schedule 16.07.2012