所以我想要做的就是当用户在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();
}
这个方法没有任何问题,它确实得到了正确的单词和一切,但问题是如果用户输入WHILE试图获取单词,它似乎不会更新(仍显示结果来自旧搜索)。在我的Handler中,我基本上只是将ListView的适配器设置为从方法生成的字符串数组(resultsArray)。我能想到的一些可能的解决方案是立即停止线程的执行,或者如果用户在线程运行时键入并使其处理EditText内的当前文本,则找到一种方法使其取消先前的请求。任何其他解决方案将不胜感激。感谢。
注意:如果线程在用户键入之前完成执行,它可以正常工作。只有当线程仍在执行且用户开始输入时,它才会成为一个问题。
答案 0 :(得分:0)
您try
下的代码可能不像您期望的那样有效。我相信,它实际上并没有停止前一个帖子(请参阅已弃用的方法文档suspend(),destroy(),stop())。
看起来您可能有多个同时运行的线程并且只接收单个消息。
我建议在while循环中查看runnable中的isInterrupted()(如Thread.currentThread()。isInterrupted()),如果线程被中断,则不发送消息。