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 ループ (Thread.currentThread().isInterrupted() など) 内で実行可能な isInterrupted()をチェックし、スレッドが中断された場合はメッセージを送信しないことをお勧めします。

于 2012-07-19T04:58:10.613 に答える