0

所以我要做的基本上是当/当用户在 EditText 中输入时,我基本上想搜索以 EditText 内的任何内容开头的所有单词(通过执行 editText.getText().toString( ))。我在 EditText 中添加了一个 TextChangedListener,每当用户键入任何字符时,它都会调用名为“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();
}

而且该方法没有任何问题,它确实得到了正确的单词和所有内容,但问题是如果用户在尝试获取单词时键入,它似乎没有更新(仍然显示旧搜索的结果)。在我的处理程序中,我基本上只是将我的 ListView 的适配器设置为从该方法生成的字符串数组(resultsArray)。我能想到的一些可能的解决方案是立即停止线程的执行,或者如果用户在线程运行时键入,则找到一种方法使其取消先前的请求,并使其处理 EditText 中的当前文本。任何其他解决方案将不胜感激。谢谢。

注意:如果线程在用户键入之前完成执行,则它可以正常工作。只有当线程仍在执行并且用户开始键入时,它才会成为问题。

4

1 回答 1

0

可能,您的代码try不像您期望的那样工作。我相信,它实际上并没有停止以前的线程(请参阅不推荐使用的方法文档suspend()destroy()stop())。看起来您可能有多个同时运行的线程并且只接收一条消息。我建议在 while 循环中检查你的可运行对象中的isInterrupted()(如 Thread.currentThread().isInterrupted()),如果线程被中断,则不要发送消息。

于 2012-07-19T04:58:10.613 回答