안녕하세요. 앱 개발중 어려운부분이 생겨서 문의 드립니다.

데이터가 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();

  }
 }