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将后台工作的结果从传递doInBackGround()onPostExecute()。我认为 Android 的设计者打算让您使用 的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 回答