我有一个Activity,用户在其中输入EditText,点击搜索按钮,应用程序查询Web服务并将结果放入ListView中。
我想取消搜索按钮。
显然,我不希望用户输入的每个字符都命中Web服务。我只想在用户完成输入时执行1次Web服务调用。
我实现这个功能的方法如下:
我有一个成员变量,保存一个AsyncTask。当EditText中的文本发生更改时,AsyncTask会启动。在doInBackground()中,调用Thread.sleep()。这个休眠时间本质上是一个计时器,等待看看用户是否还要输入其他内容。在sleep调用之后,如果AsyncTask没有被取消,那么就会调用Web服务。如果用户输入了另一个字母,则在AsyncTask上调用cancel()(停止调用Web服务),将保存AsyncTask的成员变量设置为null,并创建AsyncTask的新实例。
我有几个问题:我是否泄漏了内存?这种方法有什么特别糟糕的地方吗?我知道它可能不是最有效的,但我会严重拖慢某人的手机吗?有没有更好的方法来实现这个功能?
我想取消搜索按钮。
显然,我不希望用户输入的每个字符都命中Web服务。我只想在用户完成输入时执行1次Web服务调用。
我实现这个功能的方法如下:
我有一个成员变量,保存一个AsyncTask。当EditText中的文本发生更改时,AsyncTask会启动。在doInBackground()中,调用Thread.sleep()。这个休眠时间本质上是一个计时器,等待看看用户是否还要输入其他内容。在sleep调用之后,如果AsyncTask没有被取消,那么就会调用Web服务。如果用户输入了另一个字母,则在AsyncTask上调用cancel()(停止调用Web服务),将保存AsyncTask的成员变量设置为null,并创建AsyncTask的新实例。
我有几个问题:我是否泄漏了内存?这种方法有什么特别糟糕的地方吗?我知道它可能不是最有效的,但我会严重拖慢某人的手机吗?有没有更好的方法来实现这个功能?
private SearchTask mSearchTask = null;
...
mSearchText.addTextChangedListener(new TextWatcher() {
public void onTextChanged(CharSequence s, int start, int before, int count) {
// Auto-generated method stub
}
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// Auto-generated method stub
}
public void afterTextChanged(Editable s) {
if (s != null && s.length() > 0) {
// stop any current search thread
if (mSearchTask != null && !mSearchTask.isCancelled()) {
mSearchTask.cancel(false);
}
// search for products
SearchCriteria crit = new SearchCriteria();
crit.strSearchWord = mSearchText.getText().toString().trim();
mSearchTask = null;
mSearchTask = new SearchTask();
mSearchTask.execute(crit);
}
}
});
...
private class SearchTask extends AsyncTask<SearchCriteria, Integer, Boolean> {
protected Boolean doInBackground(SearchCriteria... params) {
SearchCriteria crit = null;
if (params.length > 0) {
crit = params[0];
if (crit != null) {
try {
Thread.sleep(1000L);
if (!isCancelled()) {
// perform search
return true;
}
}
catch(Exception e) {
}
}
}
return false;
}
protected void onPostExecute(Boolean success) {
if (success != null && success == true) {
// do something
}
else {
// do something else
}
}
}