用于带回调的异步 API 的 Android AutocompleteTextView 适配器

And*_*rov 4 android autocompletetextview

我致力于通过一些 REST API 实现自动完成建议(它实际上是 Nokia Here Geocoder Autocomplete API,但它并不那么重要)。我为AutoCompleteTextView.

public class GeoAutocompleteAdapter extends BaseAdapter implements Filterable {

@Override
public Filter getFilter() {
    Filter filter = new Filter() {

        @Override
        protected Filter.FilterResults performFiltering(CharSequence constraint) {
            FilterResults filterResults = new FilterResults();

            // obtain some autocomplete data

            filterResults.values = res;
            filterResults.count = res.size();
            return filterResults;
        }
        //...
      }
//...
}
Run Code Online (Sandbox Code Playgroud)

据我了解,部分"obtain some autocomplete data"在线程池中运行。如果我以同步方式获得自动完成的结果 - 它的工作。例如,我可以使用HttpURLConnectionInputStream- 所有同步阻塞调用在这里工作得很好。

但是如果我需要在这里调用一些以异步方式运行的 API,比如通过 Callback\Listener 呢?

我怎样才能在 performFiltering 中调用这样的东西?

request.execute(
        new ResultListener<List<com.here.android.mpa.search.Location>>() {
            @Override
            public void onCompleted(List<Location> locations, ErrorCode errorCode) {

            }
        //...
        }
Run Code Online (Sandbox Code Playgroud)

如何在回调不给我结果的情况下推迟从方法返回?

提前致谢,

Arn*_*Rao 6

您可以让线程在 performFiltering 方法中等待来自异步 API 的结果,直到收到响应。

由于方法 performFiltering 在工作线程中运行,您可以让线程等待结果,如下所示,lockTwo 是 object 和 placeResults 布尔指标。

        while (!placeResults) {
            synchronized (lockTwo) {
                try {
                    lockTwo.wait();
                } catch (InterruptedException e) {

                }
            }
        } 
Run Code Online (Sandbox Code Playgroud)

在回调或监听器中,一旦响应被处理,添加如下所示的通知。

                placeResults = true;
                synchronized (lockTwo) {
                    lockTwo.notifyAll();
                }
Run Code Online (Sandbox Code Playgroud)

有关更多信息,您可以在http://www.zoftino.com/google-places-auto-complete-android查看地点自动搜索示例