2012-07-19 4 views
0

그래서 내가 뭘 하려는지 기본적으로/사용자가 EditText 안에 입력 할 때 기본적으로 EditText 안에 무엇이든 시작하는 모든 단어를 검색하려면 editText.getText(). toString())을 수행하여 얻을 수 있습니다. 이 실제로 나올까요,안드로이드 개발 - 스레드와 처리기 함께 문제

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(); 
} 

그리고 그 방법으로 아무 문제가 없다 : 나는 다음과 같은 코드를 사용 "addResults"라는 메소드를 호출, 사용자 유형 내 글고 치기에 때마다 모든 문자를 TextChangedListener 추가 올바른 단어와 모든 것은 있지만 문제는 단어를 얻으려는 동안 사용자가 단어를 입력해도 업데이트되지 않는 것입니다 (이전 검색 결과는 계속 표시됨). 내 Handler 내부에서 기본적으로 ListView의 어댑터를 메서드에서 생성 된 문자열 배열 (resultsArray)로 설정합니다. 그리고 내가 생각할 수있는 몇 가지 가능한 해결책은 스레드의 실행을 즉시 중지하거나 스레드가 실행 중일 때 사용자가 입력 중이며 EditText 내부의 현재 텍스트를 처리하게하는 경우 이전 요청을 취소하는 방법을 찾는 것입니다. 다른 해결책은 크게 감사하겠습니다. 감사.

참고 : 사용자가 입력하기 전에 스레드가 실행을 끝내면 제대로 작동합니다. 스레드가 여전히 실행 중이며 사용자가 입력을 시작하는 경우에만 문제가됩니다.

답변

0

아마, try 아래의 코드가 예상대로 작동하지 않습니다. 나는 그것이 실제로 이전 스레드를 멈추지 않는다고 믿는다 (권장되지 않음 메소드 설명서 suspend(), destroy(), stop() 참조). 동시에 여러 스레드가 있고 단일 메시지 만 수신하는 것처럼 보입니다. while 루프 (Thread.currentThread(). isInterrupted())와 같이 Runnable while 루프에서 isInterrupted()을 확인하고 스레드가 중단 된 경우 메시지를 보내지 마십시오.

+0

좋아요. 내 스레드 안에 코드를 추가했고 작동하는지 확인해 보겠습니다. 감사. 편집 : 작동하지 않는 것 같습니다. –

+0

이 질문을하기 전에 조사를 해보니 분명히 Timer 및 TimerTask를 사용하는 것이 좋을지도 모릅니다. 비록 내가 올바른 사용법을 정말로 이해하지 못한다면, 누군가가 올바른 방향으로 나를 안내 할 수 있다면 크게 감사 할 것입니다. –

+0

로그인하는 동안 단일 스레드 만 실행 중이라는 것을 기록하고 확인 했습니까? 또 다른 제안은 타이핑을위한 타임 아웃을 추가하는 것입니다 (가장 간단한 방법 - 사용자가 빠르게 타이핑 할 때 모든 문자를 처리하지 않고 몇 초 동안 사용하지 않을 때 핸들러와 postDelayed() 사용). – sandrstar