У меня есть textWatcher для моего editText. Идея такова:Android Активность зависает во время поиска из базы данных
У меня есть два вида списка, и они оба обновляются после каждого вставленного символа поля editText. Как-то я не смог реализовать это, используя стандартный ArrayAdapter с методом фильтра. Поэтому я должен был выполнить свою собственную реализацию поиска. В начале это показалось хорошим, но как только я добавил к своей базе данных более менее необходимые данные, интерфейс начал замораживаться.
Это вызов
inputSearch.addTextChangedListener(createAndReturnTextWatcher());
И это метод, который создает и возвращает textWatcher
private TextWatcher createAndReturnTextWatcher() {
final List<String> list = dbExtractor.getDataForSearchAdapters();
TextWatcher watcher1;
watcher1 = new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
if (cs.length() == 0) {
lv.setAdapter(null);
lv2.setAdapter(null);
dc.clickedOnce = true;
dc.decrement();
dc.checkDimCounter();
} else {
setSecondListData(list, String.valueOf(cs));
setFirstListData(list, String.valueOf(cs));
if (dc.clickedOnce) {
dc.increment();
dc.checkDimCounter();
dc.clickedOnce = false;
}
}
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
}
@Override
public void afterTextChanged(Editable arg0) {
}
};
return watcher1;
}
И это методы, которые выполняют фильтрацию
private void setSecondListData(List<String> inputData, String cs) {
List<String> result = turkishSearcher.performFiltering(inputData, cs);
ArrayAdapter turkAdapt = new ArrayAdapter(this, R.layout.dictionary_list_item, R.id.product_name,
result);
lv2.setAdapter(turkAdapt);
}
private void setFirstListData(List<String> inputData, String cs) {
List<String> result = normSearcher.performFiltering(inputData, cs);
ArrayAdapter turkAdapt = new ArrayAdapter(this, R.layout.dictionary_list_item, R.id.product_name,
result);
lv.setAdapter(turkAdapt);
}
И это класс, который фильтрует данные
public class TurkishSearcher extends Searcher{
@Override
int returnPosition() {
return 1;
}
@Override
String reverse(String couples) {
java.lang.String[] arr = couples.split(" — ");
return arr[1]+ " — " + arr[0];
}
@Override
String replaceTurkish(String words) {
if (checkWithRegExp(words)) {
return words.toLowerCase().replaceAll("ç", "c").replaceAll("ğ", "g").replaceAll("ı", "i").
replaceAll("ö", "o").replaceAll("ş", "s").replaceAll("ü", "u");
} else return words;
}
public static boolean checkWithRegExp(String word){
Pattern p = Pattern.compile("[öçğışü]", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(word);
return m.find();
}
}
Я четко понимаю, что так, как я сохранить данные неправильно и поиск algorhytm не хорошо, как хорошо. Но у меня вопрос:
Возможно ли избежать замораживания, используя Threads для реализации поиска. Могу ли я поместить обоих искателей в свои потоки, чтобы как-то избежать зависания интерфейса? Если это возможно, PLS скажите мне лучшее место в коде, где я могу использовать потоки.
Спасибо заранее!
ли база данных доступа задачи в фоновом потоке – LearnPainLess