2013-04-13 29 views
0

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

编辑 这是我的代码,

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

正如你可以打电话取消同一个对象后立即看到我调用execute()。另外,正如我所说的,我有多个循环(6)。我很担心这个函数isCancelled(),当对象立即初始化时,其中一个for循环返回true。

+0

参见[这](http://stackoverflow.com/a/10882600/1289716)的回答可以帮助你... – MAC

+1

“正如你所看到的,我调用execute()调用取消同一个对象后立即“。它们不是同一个对象。你用同样的指针调用它,在'new'关键字之后它指向一个新的对象。 – Budius

+0

请参阅**在[此Android API文档页面]上取消任务**(http://developer.android.com/reference/android/os/AsyncTask.html) – Nate

回答

0

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

+1

AsyncTask已经有[isCancelled()](http: //developer.android.com/reference/android/os/AsyncTask.html#isCancelled())就是为了这个目的。不需要创建另一个标志。 – Nate

1

尝试使用类似

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

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

的,如果用一句话,如果你有很多循环,至少这是我所经历的还是不错的。当然这些应该在doInBackground()中使用。

2

除了已经给出的答案。

停止(取消)AsyncTask是合作行为。这意味着只需拨打AsyncTask.cancel()是不够的。这个调用只是设置一个取消的状态(一个标志),不做任何事情。您的AsyncTask实施应提供合作(帮助)以实际停止处理。具体而言,这意味着如果您希望AsyncTask的可取消性高度响应,您需要安排检查取消状态的频率。因此,将if (isCancelled()) { return null; }语句放入循环中。