Разработка Android - вместе с Thread и Handler
Поэтому я пытаюсь в основном, когда / когда пользователь печатает внутри EditText, я в основном хочу найти все слова, которые начинаются с того, что находится внутри EditText (достигается путем выполнения editText.getText(). ToString()). Я добавил TextChangedListener в свой EditText и всякий раз, когда пользователь вводит какой-либо символ, он вызывает метод "addResults", который использует следующий код:
public void addResults(final String prefix){
if(thread != null){
try{
thread.wait();
thread.interrupt();
thread.suspend();
thread.destroy();
thread.stop();
thread = null;
}catch(Exception e){
}
}
results.clear();
resultsArray = null;
this.prefix = prefix;
thread = new Thread(
new Runnable(){
public void run(){
try{
URL url = new URL(String.format(WORD_URL, prefix));
URLConnection connection = url.openConnection();
connection.setReadTimeout(Timeout.TIMEOUT);
connection.setConnectTimeout(Timeout.TIMEOUT);
InputStream is = connection.getInputStream();
Scanner reader = new Scanner(is);
while(reader.hasNextLine()){
String line = reader.nextLine();
if(line != null){
if(line.contains(String.format(CHECKER, prefix))){
String[] s = line.split(String.format(CHECKER, prefix));
String[] s2 = s[1].split(INIT_SPLIT);
if(s2.length > 0){
for(int i = 1; i < s2.length; i++){
String l = s2[i];
String[] split = l.split(SECOND_SPLIT);
results.add(new Result(prefix, split[0].trim()));
}
}
break;
}
}
}
resultsArray = WordSearcher.toArray(results);
handler.sendMessage(handler.obtainMessage());
reader.close();
}catch(Exception e){
e.printStackTrace();
}
}
}
);
thread.start();
}
И в этом методе нет ничего плохого, он действительно получает правильные слова и все, но проблема в том, что если пользователь вводит WHILE, пытаясь получить слова, он не обновляется (по-прежнему отображаются результаты старого поиска). Внутри моего обработчика я просто устанавливаю адаптер моего ListView на строковый массив (resultsArray), полученный из метода). И некоторые возможные решения, о которых я могу подумать, это либо немедленно остановить выполнение потока, либо найти способ заставить его отменить предыдущий запрос, если пользователь печатает во время работы потока, и заставить его обрабатывать текущий текст внутри EditText. Любые другие решения будут с благодарностью. Благодарю.
Примечание. Это прекрасно работает, если поток завершает работу до того, как пользователь введет текст. Это становится проблемой только тогда, когда поток все еще выполняется, и пользователь начинает печатать.
1 ответ
Возможно, Ваш код под try
работает не так, как вы ожидаете. Я считаю, что на самом деле это не останавливает предыдущий поток (см. Документацию устаревших методов suspend (), destroy (), stop ()). Похоже, у вас может быть количество одновременно запущенных потоков и получение только одного сообщения. Я бы посоветовал проверить isInterrupted () внутри вашего runnable в цикле while (например, Thread.currentThread(). IsInterrupted ()) и не отправлять сообщение, если поток был прерван.