나는 TextChangedListener
과 ListView
의 간단한 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);
}
};
메시지 msg
는 search
방법에서 보낸 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에 여러 번 추가되므로 모두 병렬로 실행되는 것처럼 보입니다.
어떻게 이것을 피할 수 있습니까?
당신이 검색 방법을 게시 할 수 있습니다 possible- 경우 검색 - 또는 당신이 당신의 검색을 수행하는 동안 더 나은 일을 한 후 스레드에서 결과를 반환하기 전에
Thread.interrupted()
을 확인해야합니까? – Blackbelt스레드가 필요하지 않습니다. 검색 게시 (쿼리) – Raghunandan
@Raghunandan 사용자의 입력하는 동안 그것을 취소 할 수 있도록 여분의 스레드가 필요합니다 내 질문을 편집했습니다. – xoxox