1

У меня есть 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 скажите мне лучшее место в коде, где я могу использовать потоки.

Спасибо заранее!

+0

ли база данных доступа задачи в фоновом потоке – LearnPainLess

ответ

2

Вы не должны блокировать основной поток посредством операций с базой данных. Вместо того, чтобы использовать:

 new AsyncTask<Void, Void, Void>() { 
     @Override 
     protected Void doInBackground(Void... unusedParams) { 
      // TODO: do your database stuff 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void aVoid) { 
      // TODO: refresh UI elements, because thread finished 
      super.onPostExecute(aVoid); 
     } 
    }.execute(); 
+0

Ой, спасибо. Этот вид подтверждения - то, что я хотел прочитать :) База данных загружается только один раз в начале работы (еще не с Async Task). И затем я работаю только со списком строк. Is AsyncTask нормально для этого случая тоже? –

+1

Я бы не стал загружать базу данных в начале в mainthread. Это правила строгого режима, описанные здесь: https://developer.android.com/reference/android/os/StrictMode.html – lidox

+0

Е. Я знал это раньше. Таким образом, все данные базы данных будут удалены и для асинхронной задачи. Большое вам спасибо за помощь: 3 Е. и еще один вопрос. Итак, Asynctask хорош для расчетов, которые я описал? Как для поиска? –

2

Лучший способ выполнения длинных задач в фоновом режиме. Вы можете использовать asynctask для этого.

+0

Спасибо, вот что я хотел читать :) –

+0

Если мой ответ помогает и, то, пожалуйста, примите мой ответ, чтобы оценить меня .. :) – LearnPainLess

Смежные вопросы