У меня есть действие, в котором пользователь вводит 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
}
}
}