Android开发-线程和处理程序一起发布

Android开发-线程和处理程序一起发布,android,multithreading,handler,handle,Android,Multithreading,Handler,Handle,因此,我试图做的基本上是当用户在EditText中键入时,我基本上希望搜索所有以EditText中的任何内容开头的单词(通过执行EditText.getText().toString()实现)。我在EditText中添加了一个TextChangedListener,每当用户键入任何字符时,它都会调用名为“addResults”的方法,该方法使用以下代码: public void addResults(final String prefix){ if(thread != null){

因此,我试图做的基本上是当用户在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();
}
public void addResults(最终字符串前缀){
if(线程!=null){
试一试{
thread.wait();
thread.interrupt();
thread.suspend();
thread.destroy();
thread.stop();
线程=null;
}捕获(例外e){
}
}
结果:清晰();
resultsArray=null;
this.prefix=前缀;
线程=新线程(
新的Runnable(){
公开募捐{
试一试{
URL=新URL(String.format(WORD_URL,前缀));
URLConnection=url.openConnection();
connection.setReadTimeout(Timeout.Timeout);
connection.setConnectTimeout(Timeout.Timeout);
InputStream is=connection.getInputStream();
扫描仪阅读器=新扫描仪(is);
while(reader.hasNextLine()){
String line=reader.nextLine();
如果(行!=null){
if(line.contains(String.format(CHECKER,prefix))){
String[]s=line.split(String.format(CHECKER,前缀));
字符串[]s2=s[1]。拆分(初始化拆分);
如果(s2.length>0){
对于(int i=1;i
这种方法没有什么错,它确实得到了正确的单词和所有东西,但问题是,如果用户在尝试获取单词时键入,它似乎不会更新(仍然显示旧搜索的结果)。在我的处理程序中,我基本上只是将ListView的适配器设置为该方法生成的字符串数组(resultsArray)。我能想到的一些可能的解决方案是,要么立即停止线程的执行,要么找到一种方法,如果用户在线程运行时键入,让它取消上一个请求,并让它处理EditText中的当前文本。任何其他解决方案都将不胜感激。谢谢


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

可能,您在
try
下的代码并不像您预期的那样工作。我相信,它实际上并没有停止前面的线程(请参阅已弃用的方法文档)。 看起来您可能有多个线程同时运行并只接收一条消息。
我建议检查您的runnable in-while循环(如Thread.currentThread().isInterrupted()),如果线程被中断,则不要发送消息。

好的,我在线程中添加了代码,看看它是否有效。谢谢编辑:当我在问这个问题之前做研究时,它似乎不起作用,显然使用定时器和定时器任务是件好事,也许我应该看看。虽然我真的不明白正确的用法,所以如果有人能给我正确的指导,我将不胜感激。你是否已经登录并确保在打字时只运行一个线程?另一个建议是为键入添加一些超时(最简单的方法是使用handler和postDelayed(),如果用户键入速度很快,就不要处理每个字母,而是等待几秒钟的不活动时间)。我不太明白,因为我缺乏安卓开发方面的知识。如果你能将我重定向到一个能展示例子的网站,我将不胜感激。不幸的是,我还没有找到任何合适的例子。通常,只需将addResults()调用移动到某个runnable并调用postDelayed(),而不是从TextEntry回调直接调用addResults()。