Как реализовать функцию javascript setTimeout в Java - PullRequest
0 голосов
/ 01 ноября 2010

В настоящее время я пытаюсь интегрировать функцию поиска в реальном времени в Android.Я использую настроенный виджет автозаполнения.Сам виджет предоставляет мне порог для запуска запроса только после того, как набрано определенное количество символов. Но я также хочу, чтобы запрос запускался только, скажем, если пользователь прекратил печатать в течение 2 секунд.

Когда я загружал свое содержимое с помощью AsyncTask, я попытался заблокировать функцию doInBackground, вызвав Thread.sleep () в самом начале.Если пользователь продолжит вводить программу, она позаботится о существующей задаче, отменит ее и запустит новую.Это была моя идея.Но это не совсем так, как я ожидал.Иногда он отправляет запросы, даже если пользователь все еще печатает, иногда запросы отменяются после того, как пользователи перестали печатать.

У вас есть идеи по этому поводу или, возможно, лучший способ решить эту проблему?

Вот фрагменты кода:

1.Функция, которая вызывается для текста, изменяется:

public void afterTextChanged(Editable s) {
    if(mWidget.enoughToFilter()) {
        if(mTask != null && mTask.getStatus() != Status.FINISHED) {
            mTask.cancel(true);
        }

        mTask = new KeywordSearchLoader(mActivity, 
                mItems);

        mTask.execute(s.toString());

    }
}

2.doInBrackground

try {
    Thread.sleep(Properties.ASYNC_SEARCH_DELAY);
} catch (InterruptedException e) {
    Log.e(TAG, "the process was interrupted while sleeping");
    Log.w(TAG, e);
}

Спасибо, Фил

1 Ответ

2 голосов
/ 01 ноября 2010

Создайте Handler и используйте .postDelayed(..) для запуска фоновой задачи после некоторой задержки.

Если пользователь нажимает клавишу, затем позвоните handler.removeCallback(..), а затем снова .postDelayed(..), чтобы добавить новый отложенный обратный вызов.

...