0

我有一个 EditText 和一个 AsyncTask 类。每当 EditText 中的文本发生更改时,AsyncTask 类的对象就会创建并使用字符串对其调用 execute()。并且 doBackground() 被调用,它只有一个函数,而该函数又依次具有多个 for 循环。每当文本更改时,都会为 AsyncTask 创建一个新对象。当文本改变时,旧的 Async 对象必须被取消,新的对象应该控制。但是当我在对象上调用取消时,旧的继续运行并且似乎调用 onPostExecute()。有没有办法避免这种情况。我的意思是,我可以在运行新对象之前完全杀死/(停止运行)旧的 asyncTask 对象吗?

编辑 这是我的代码,

if (getSuggestions1.getStatus() != AsyncTask.Status.RUNNING) {
    getSuggestions1.cancel(true);
    getSuggestions1 = new GetSuggestions1();
    getSuggestions1.execute(new String[] { str });
}

如您所见,我在对同一对象调用取消后立即调用 execute()。另外,正如我所说,我有多个 for 循环(6)。我担心函数 isCancelled() 会在对象立即初始化时为其中一个 for 循环返回 true。

4

3 回答 3

2

除了已经给出的答案。

停止(取消)anAsyncTask是一种合作行为。这意味着仅仅调用AsyncTask.cancel()是不够的。这个调用只是设置了一个取消的状态(一个标志),并且什么也不做。您的AsyncTask实现应该提供合作(帮助)以真正停止处理。具体来说,这意味着如果您希望您AsyncTask的可取消性具有高度响应性,您需要安排相当频繁地检查已取消状态。所以把if (isCancelled()) { return null; }语句放在你的循环中。

于 2013-04-14T12:17:39.807 回答
1

尝试使用类似的东西

while (!isCancelled()) {
    // processing
}

或者

if (!isCancelled()) {
    // processing
}

如果您有很多循环,则 if 语句很好,至少这是我所经历的。当然应该使用这些doInBackground()

于 2013-04-13T20:44:01.200 回答
0

您可以在扩展 ASyncTask 的类中创建一个名为 shouldCancel 的布尔标志,并定期在 中检查它doInBackground(),如果已设置,则从doInBackground方法返回。

于 2013-04-13T20:39:25.550 回答