0

我正在编码一个Android字典应用程序。但我得到这个错误: 当我输入EditText时,我会调用onTextChanged(),在这个方法中我执行一个AsyncTask线程。每次输入字符时,应用程序都会调用onTextChange()并执行AsyncTask。例如,我输入“da”应用程序将在数据库中搜索“da%”这个单词,我继续输入“dat”它将启动一个新的AsyncTask线程并在数据库中搜索“dat%”。但2线程创建并在DB中搜索,它会在返回第二个线程之前执行第一个线程(我想在执行线程2之前停止线程1)。这些问题使我的应用运行速度非常慢。如何重新启动搜索AsyncTask线程时Edditext onTextChanged()

这是我的代码:

的EditText上的功能:

public void afterTextChanged(Editable s) {} 
      public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
      public void onTextChanged(CharSequence s, int start, int before, int count) { 
       keyword = txtKeyword.getText().toString().trim(); 
       new Searching().execute("500"); 
      } 
     }); 

的的AsyncTask类:

private class Searching extends AsyncTask<String, String, String> { 
    @Override 
    protected String doInBackground(String... params) { 
    publishProgress("Searching..."); 
    try { 
     searchlist = search(keyword);//this method will search in DB (SELECT * FFROM dictionary where word like 'da%';) 
    } catch (Exception e) { 
    e.printStackTrace(); 
    resp = e.getMessage(); 
    } 
    return null; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
    adapter.setListView(searchlist); 
    lvData.setAdapter(adapter); 
    } 
    @Override 
    protected void onPreExecute() { 
    } 
    @Override 
    protected void onProgressUpdate(String... text) { 
     txtResult.setText(text[0]); 
    } 
} 

回答

0

您的性能问题很可能与您的LIKE查询有关,该查询不使用索引。如果您需要这种类型的查询,请考虑设置结果数量的限制(如果您还没有的话)。

也许应该考虑使用FTS,如解释here所述。

考虑将此与异步游标LoaderManager一起使用,它还可以处理游标的生存期。

所有告诉如果你走这条路线,你可能会发现你不需要取消查询一旦它在飞行中。