2013-06-15 2 views
1

나는 TextChangedListenerListView의 간단한 EditText을 가지고 있습니다.Android : 검색 시작 스레드

onTextChanged 메서드는 restartSearch 메서드를 호출하므로 EditText에 입력하는 동안 현재 검색 스레드를 다시 시작해야합니다.

search 메서드는 일치하는 항목을 ListView에 추가하기 만합니다.

searchThread이 아직 살아있을 때 취소하고 검색을 다시 시작하여 입력하는 동안 UI가 멈추지 않고 오래 걸리지 않도록하고 싶습니다.

Thread searchThread; 

private void restartSearch(CharSequence cs){ 
    query = cs; 
    if(searchThread != null && searchThread.isAlive()){ 
     searchThread.interrupt(); 
    } 
    searchThread = new Thread(new Runnable() { 
     public void run() { 
      if(!lastSearch.equals(query)) 
       search(query); 
     } 
    }); 
    searchThread.start(); 
} 

I가 콜을 발있어서

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    EditText etSearch = ((EditText) findViewById(R.id.etSearch)); 

    //... 

    etSearch.addTextChangedListener(new TextWatcher() { 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      // TODO Auto-generated method stub 
      restartSearch(s); 
     } 

     //... 
    }); 
} 

및 다른 (I은 또한 UI를 업데이트 곳에서)

final Handler handler = new Handler(){ 
    @Override 
    public void handleMessage(Message msg) { 
     if(msg.what==1){ 
      //... 
      adapter.notifyDataSetChanged(); 
      restartSearch(lastSearch); 
     } 
     else if(msg.what==2) 
      adapter.notifyDataSetChanged(); 
     super.handleMessage(msg); 
    } 
}; 

메시지 msgsearch 방법에서 보낸 UI 업데이트 :

private void search(CharSequence s){ 
     searchResults.clear(); 
    if(!s.toString().equals("")){ 
     for(int i=0; i<vocsCount; i++){ 
      try{ 
       getResult(i, 0, 2,s); 
       getResult(i, 1, 1,s); 
      }catch(Exception ex){} 
     } 
     Collections.sort(searchResults); 
    } 
    Message msg = handler.obtainMessage(); 
    msg.what = 2; 
    handler.sendMessage(msg); 

    lastSearch = s; 
} 

그래서 매번 새로운 Runnable을 생성하므로 모든 검색 항목이 ListView에 여러 번 추가되므로 모두 병렬로 실행되는 것처럼 보입니다.

어떻게 이것을 피할 수 있습니까?

+0

당신이 검색 방법을 게시 할 수 있습니다 possible- 경우 검색 - 또는 당신이 당신의 검색을 수행하는 동안 더 나은 일을 한 후 스레드에서 결과를 반환하기 전에 Thread.interrupted()을 확인해야합니까? – Blackbelt

+0

스레드가 필요하지 않습니다. 검색 게시 (쿼리) – Raghunandan

+0

@Raghunandan 사용자의 입력하는 동안 그것을 취소 할 수 있도록 여분의 스레드가 필요합니다 내 질문을 편집했습니다. – xoxox

답변

0

여기에 스레드를 만들 필요가 없다고 생각합니다. GUI가 다른 스레드에서 수신 대기하고 'onTextChanged'에서 다른 스레드에서 발생하는 콜백을 제공하기 때문에. 두 스레드가 다르지 않은 경우 검색을 수행하는 동안 GUI 응답을 유지할 수 없었을 것입니다.

+1

백그라운드 스레드에서 검색을 수행하지 않으면 입력하는 동안 UI가 응답하지 않습니다. – xoxox

0

Thread.interrupt()을 사용하고 있지만 스레드 구현시 Thread.interrupted() 값을 쿼리하고 있습니까?

당신은