我有一个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,因为对象会立即初始化。
答案 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
方法返回。