그래서 내가 뭘 하려는지 기본적으로/사용자가 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 내부의 현재 텍스트를 처리하게하는 경우 이전 요청을 취소하는 방법을 찾는 것입니다. 다른 해결책은 크게 감사하겠습니다. 감사.
참고 : 사용자가 입력하기 전에 스레드가 실행을 끝내면 제대로 작동합니다. 스레드가 여전히 실행 중이며 사용자가 입력을 시작하는 경우에만 문제가됩니다.
좋아요. 내 스레드 안에 코드를 추가했고 작동하는지 확인해 보겠습니다. 감사. 편집 : 작동하지 않는 것 같습니다. –
이 질문을하기 전에 조사를 해보니 분명히 Timer 및 TimerTask를 사용하는 것이 좋을지도 모릅니다. 비록 내가 올바른 사용법을 정말로 이해하지 못한다면, 누군가가 올바른 방향으로 나를 안내 할 수 있다면 크게 감사 할 것입니다. –
로그인하는 동안 단일 스레드 만 실행 중이라는 것을 기록하고 확인 했습니까? 또 다른 제안은 타이핑을위한 타임 아웃을 추가하는 것입니다 (가장 간단한 방법 - 사용자가 빠르게 타이핑 할 때 모든 문자를 처리하지 않고 몇 초 동안 사용하지 않을 때 핸들러와 postDelayed() 사용). – sandrstar