У меня есть действие, когда пользователь вводит текст EditText, нажимает кнопку поиска, и приложение запрашивает веб-службу и помещает результаты в ListView.
Я бы хотел покончить с кнопкой поиска.
Очевидно, я не хочу, чтобы каждый символ, который пользователь вводит, попадал в веб-сервис. Я хочу выполнить только 1 вызов веб-службы, когда пользователь закончит ввод.
То, как я этого добиваюсь, выглядит так:
У меня есть переменная-член, которая содержит AsyncTask. Когда текст в EditText изменяется, AsyncTask срабатывает. Внутри doInBackground () происходит вызов Thread.sleep (). Этот период ожидания по сути является таймером, ожидающим, чтобы увидеть, печатает ли пользователь что-либо еще. После неактивного вызова выполняется вызов веб-службы, если AsyncTask не был отменен. Если пользователь вводит другую букву, на AsyncTask вызывается метод cancel () (чтобы запретить вызов веб-службы), переменной-члену, содержащей 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
}
}
}