안녕하세요. 앱 개발중 어려운부분이 생겨서 문의 드립니다.
데이터가 4만개 가량 있는 사전 앱인데, 실시간 검색을 구현하고 싶습니다.
Textwatcher를 이용하여 입력받은 데이터를 실시간 검색하도록 하였는데,
입력 할때마다 DB를 select를 하게되, select 하는 시간이 길어서 충돌을 합니다..
그래서 입력후 1~2초간 추가 입력이 없으면 검색을 하도록 하려 하는데요..
Timer 역시 입력시마다 중복되서 실행되서 결과를 여러번 출력하고 또, 커서끼리 충돌한 데이터는 select하지도 못하네요..
Timer를 이용하지 않고 바로 이전 쿼링을 중단시킬 방법이나, 작동중인 Timer를 모두 중단시키는 방법을 알고 싶습니다..
다음은 해당부분 소스입니다..
private void startTime(final Editable s, final String k){
final Timer timer = new Timer();
final Handler handler = new Handler();
TimerTask startTimerTask = new TimerTask(){
Runnable runable = new Runnable(){
@Override
public void run() {
// try{
countdown++;
// _Title = (TextView) findViewById(R.id.title);
// _Title.setText(countdown);
if(s.length()<=1){
countdown = 0;
timer.cancel();
_DBhandler.refresh("select memo, islast from myTable where priority like 0");
_DBhandler.Adapter.notifyDataSetChanged();
_Listview.setAdapter(_DBhandler.Adapter);
_Title = (TextView) findViewById(R.id.title);
_Title.setText("Main");
}
if(countdown>=5){
countdown = 0;
timer.cancel();
new DoComplecatedJob().execute(s.toString());
}
// } catch(Exception e){
// // Toast.makeText(_Activity, e.toString(), Toast.LENGTH_LONG).show();
// }
}
};
@Override
public void run() {
handler.post(runable);
}
};
timer.schedule(startTimerTask, 0, 1000);
}
TextWatcher TW = new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {
try{
// TODO Auto-generated method stub
if(s.length()>1){
_DBhandler.stop = 1;
new DoComplecatedJob().cancel(true);
countdown=0;
startTime(s,s.toString());
}else if(s.length()<=1){
_DBhandler.refresh("select memo, islast from myTable where priority like 0");
_DBhandler.Adapter.notifyDataSetChanged();
_Listview.setAdapter(_DBhandler.Adapter);
_Title = (TextView) findViewById(R.id.title);
_Title.setText("Main");
}
} catch(Exception e){
}
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void onTextChanged(CharSequence s, int start, int before,
int count) {
// TODO Auto-generated method stub
}
};
private class DoComplecatedJob extends AsyncTask<String, Integer, Long> {
@Override
protected void onPreExecute() {
try{
super.onPreExecute();
_Prgbar.setVisibility(0);
_DBhandler.stop = 1;
} catch(Exception e){
}
}
@Override
protected Long doInBackground(String... strData) {
try{
temp = strData[0];
_DBhandler.refresh("select memo, islast from myTable where memo like '%" + strData[0] + "%'");
} catch(Exception e){
}
return null;
}
@Override
protected void onProgressUpdate(Integer... progress) {
}
@Override
protected void onPostExecute(Long result) {
try{
_Prgbar.setVisibility(8);
_DBhandler.Adapter.notifyDataSetChanged();
_Listview.setAdapter(_DBhandler.Adapter);
_Title = (TextView) findViewById(R.id.title);
_Title.setText("\"" + temp + "\" (으)로 검색됨 : " + _DBhandler.Adapter.getCount() + "건");
} catch(Exception e){
}
}
@Override
protected void onCancelled() {
// TODO Auto-generated method stub
super.onCancelled();
_DBhandler._Cursor.close();
}
}




카운트는 최초에 한번실행시키고 카운트다운 숫자값을 변경시켜주는방법으로 해결했습니다만,
다른 아이디어 있으시다면 부탁드립니다~