Автоматический поиск по типам пользователей

У меня есть действие, в котором пользователь вводит EditText, нажимает кнопку поиска, а приложение запрашивает веб-службу и помещает результаты в ListView.

Я бы хотел избавиться от кнопки поиска.

Очевидно, я не хочу, чтобы каждый персонаж, вводимый пользователем, попадал в веб-службу. Я хочу выполнить только 1 вызов веб-службы, когда пользователь закончит печатать.

Я добиваюсь этого примерно так:

У меня есть переменная-член, которая содержит AsyncTask. Когда текст в EditText изменяется, запускается AsyncTask. Внутри doInBackground () происходит обращение к Thread.sleep (). Этот период сна, по сути, является таймером, ожидающим, чтобы увидеть, вводит ли пользователь что-нибудь еще. После вызова сна выполняется вызов веб-службы, если AsyncTask не был отменен. Если пользователь набирает другую букву, cancel () вызывается в AsyncTask (чтобы остановить вызов веб-службы), для переменной-члена, содержащей AsyncTask, устанавливается значение null, и создается новый экземпляр AsyncTask.

У меня есть несколько вопросов: У меня утечка памяти? Это что-то особенно плохо? Я понимаю, что это может быть не самым эффективным, но собираюсь ли я серьезно тормозить чей-то телефон? Есть ли лучший способ сделать это?

private SearchTask mSearchTask = null;

...

    mSearchText.addTextChangedListener(new TextWatcher() {

        public void onTextChanged(CharSequence s, int start, int before, int count) {
            // Auto-generated method stub
        }

        public void beforeTextChanged(CharSequence s, int start, int count,
                int after) {
            // Auto-generated method stub
        }

        public void afterTextChanged(Editable s) {
                if (s != null && s.length() > 0) {
                    // stop any current search thread
                    if (mSearchTask != null && !mSearchTask.isCancelled()) {
                        mSearchTask.cancel(false);
                    }


                        // search for products
                        SearchCriteria crit = new SearchCriteria();
                        crit.strSearchWord = mSearchText.getText().toString().trim();
                        mSearchTask = null;
                        mSearchTask = new SearchTask();
                        mSearchTask.execute(crit);
                }
        }
    });

...

private class SearchTask extends AsyncTask<SearchCriteria, Integer, Boolean> {
    protected Boolean doInBackground(SearchCriteria... params) {
        SearchCriteria crit = null;
        if (params.length > 0) {
            crit = params[0];

            if (crit != null) {
                try {
                    Thread.sleep(1000L);
                    if (!isCancelled()) {
                        // perform search
                        return true;
                    }
                }
                catch(Exception e) {
                }
            }
        }

        return false;
    }

    protected void onPostExecute(Boolean success) {
        if (success != null && success == true) {
            // do something
        }
        else {
            // do something else
        }
    }   
}
7
задан Andrew 18 May 2011 в 15:58
поделиться