GeoDataClient.getAutocompletePredictions - отмена / игнорирование предыдущих запросов - PullRequest
0 голосов
/ 11 июня 2018

Android SDK https://developers.google.com/places/android-sdk/autocomplete (программно ищите прогнозы мест)

GeoDataClient.getAutocompletePredictions () - я хотел бы игнорировать ответы, которыене последний запрос ... автозаполнение, например: «New» -> «New Y» -> «New Yo»

3 ответа - но я хочу перехватить только последний .. (НеИспользуя RX)

// Submit the query to the autocomplete API and retrieve a PendingResult that will
   // contain the results when the query completes.
   Task<AutocompletePredictionBufferResponse> results =
           geoDataClient.getAutocompletePredictions(constraint, bounds, typeFilter);
   results.addOnSuccessListener(autocompletePredictions -> {
       if (autoCompletePredictionsListener != null) {
           autoCompletePredictionsListener.onAutoCompleteSuccess(autocompletePredictions);
       }
//****Here I want to ignore(or cancel somewhere before) previous requests
       autocompletePredictions.release();
   });

iOS SDK - Решено разработчиками Google https://developers.google.com/places/ios-sdk/reference/interface_g_m_s_autocomplete_fetcher

Делегат будет вызываться только с результатами прогнозирования, еслиэти прогнозы относятся к тексту, предоставленному в самом последнем обращении к sourceTextHasChanged.

Ответы [ 2 ]

0 голосов
/ 12 июля 2018

Это нехорошо, потому что все, что вы делаете, это фильтруете результаты для отображения, но на самом деле все задачи geoDataClient в конечном итоге выполняются асинхронно, что резко снижает квоту использования.Обработчик решает эту проблему частично.

Поэтому нам нужен другой способ отменить задачу geoDataClient.getAutocompletePrediction так, как это делает обычный вызов API.

0 голосов
/ 16 июня 2018

У меня недавно была похожая потребность, и именно это я и сделал для достижения желаемого результата

// create a class-scope variable to track the most recent query
private String lastQuery;
private GeoDataClient geoDataClient;

// wrap the geoDataClient.getAutocompletePredictions in a class to associate the prediction results with the query that triggered the call
class AutocompletePredictor {
    String query;

    AutocompletePredictor(String query) {
        this.query = query;
    }

    Task<AutocompletePredictionBufferResponse> getPredictions(LatLngBounds bounds, AutocompleteFilter typeFilter) {
        return geoDataClient.getAutocompletePredictions(query, bounds, typeFilter);
    }
}

// modify your method that triggers the autocomplete filter
void filterAutocomplete(String constraint) {
    // update lastQuery every time this method is called
    lastQuery = constraint;

    // Submit the query to the autocomplete API and retrieve a PendingResult that will contain the results when the query completes.
    final AutocompletePredictor predictor = new AutocompletePredictor(constraint);
    Task<AutocompletePredictionBufferResponse> results = predictor.getPredictions(bounds, typeFilter);

    results.addOnSuccessListener(autocompletePredictions -> {
        // checks if the query for this filter is same as the most recent query issued to this method
        if (autoCompletePredictionsListener != null && predictor.query.equals(lastQuery)) {
            autoCompletePredictionsListener.onAutoCompleteSuccess(autocompletePredictions);
        }

        autocompletePredictions.release();
    });
}

Редактировать: Задержка звонков, когда пользователь печатает ...
Вместовызывая метод автозаполнения каждый раз, когда изменяется содержимое EditText (что может происходить каждый раз, когда пользователь вводит символ), запланируйте вызов автозаполнения для ожидания в течение некоторого периода времени, прежде чем он будет фактически выполнен.Если содержимое EditText снова изменится до истечения периода ожидания, отмените предыдущее расписание и измените расписание.

editText.addTextChangedListener(new TextWatcher() {
    int delayMilliseconds = 500;
    Handler handler = new Handler();

    @Override
    public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

    @Override
    public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {}

    @Override
    public void afterTextChanged(Editable editable) {
        final String constraint = editable.toString();

        // remove all delayed/pending tasks set in the last 500 milliseconds
        handler.removeCallbacksAndMessages(null);

        // setup a new delayed task to execute after 500 milliseconds
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                filterAutocomplete(constraint);
            }
        }, delayMilliseconds);
    }
});
...