Android:AsyncTask cancel()问题

时间:2013-04-13 20:33:31

标签: android android-asynctask

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

修改 这是我的代码,

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

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

3 个答案:

答案 0 :(得分:2)

除了已经给出的答案。

停止(取消)AsyncTask是一项合作行动。这意味着仅仅调用AsyncTask.cancel()是不够的。此调用仅设置已取消状态(标志),并且不执行任何操作。您的AsyncTask实施应提供合作(帮助)以实际停止处理。具体而言,这意味着如果您希望AsyncTask的取消性能具有高响应性,则需要经常安排检查取消状态。所以将if (isCancelled()) { return null; }语句放在循环中。

答案 1 :(得分:1)

尝试使用类似

的内容
while (!isCancelled()) {
    // processing
}

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

如果你有很多循环,if句也很好,至少那是我所经历过的。这些当然应该在doInBackground()中使用。

答案 2 :(得分:0)

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