Разработка 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 ()) и не отправлять сообщение, если поток был прерван.

Другие вопросы по тегам