Android AutocompleteTextView适配器,用于具有回调的异步API

4

我正在实现通过一些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;
        }
        //...
      }
//...
}

据我所知,"obtain some autocomplete data" 部分在线程池中运行。如果我以同步方式获取自动完成结果,则它可以正常工作。例如,我可以使用 HttpURLConnectionInputStream - 所有同步阻塞调用都可以在这里很好地工作。
但是,如果我需要在此处调用一些以异步方式操作的 API,例如通过回调或监听器,该怎么办呢?
如何在 performFiltering 中调用这样的内容?
request.execute(
        new ResultListener<List<com.here.android.mpa.search.Location>>() {
            @Override
            public void onCompleted(List<Location> locations, ErrorCode errorCode) {

            }
        //...
        }

当回调函数没有返回结果时,我该如何推迟方法的返回?

提前感谢您的帮助。


你可能想看一下https://dev59.com/UE3Sa4cB1Zd3GeqPt0hz。 - Dark Leonhart
请查看此链接 https://stackoverflow.com/a/54185785/4685284。只需要调用notifyDataSetChanged()即可。 - Shahbaz Hashmi
1个回答

6

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

由于performFiltering方法在工作线程中运行,您可以像下面展示的那样让线程等待结果,其中lockTwo是一个对象,placeResults是布尔指示器。

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

                }
            }
        } 

在回调函数或监听器中,一旦响应被处理,按照下面所示添加通知。
                placeResults = true;
                synchronized (lockTwo) {
                    lockTwo.notifyAll();
                }

如需了解更多信息,您可以查看以下网址的地址自动搜索示例:http://www.zoftino.com/google-places-auto-complete-android


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接