2017-02-08 79 views
2

我通過一些REST API(它實際上是諾基亞在這裏Geocoder Autocomplete API,但它並不那麼重要)的工作實現自動完成建議。我爲AutoCompleteTextView編寫自定義適配器。Android AutocompleteTextView適配器異步API與回調

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,這些API以異步方式操作,比如通過Callback \ Listener?

如何在執行過濾器時調用類似這樣的東西?

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

      } 
     //... 
     } 

如何推遲從方法返回,而回調不給我一個結果?

由於提前,

+0

檢查自動搜索例如地方,你可能想看看http://stackoverflow.com/questions/2671404/autocompletetextview-not-displaying-result-even-當最arrayadapter-是更新的 –

回答

0

可以使線程,直到收到響應等待在performFiltering方法從異步API的結果。

由於performFiltering方法在工作線程中運行,因此可以使線程等待結果,如下所示,lockTwo是object和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