AsyncTask.cancel(true)从内部呼叫doInBackground(),而不是呼叫 onCancelled(),Android呼叫onPostExecute().但根据文件:
调用此方法将导致在返回
onCancelled(Object)后在UI线程上调用doInBackground(Object[]).调用此方法可确保onPostExecute(Object)永远不会调用此方法.
这是Android中的错误吗?
更多观察:
cancel(false)从任一线程调用都按照文档中的说明进行操作.cancel(true)从UI任务调用不会调用onPostExecute(),也不会抛出InterruptedException下面的logcat跟踪中看到的内容.cancel(false/true)从任何线程调用有时onCancelled()甚至之前doInBackground()的回报.这显然违反了文件,其中规定:调用此方法将导致在返回后
doInBackground(Object[])在UI线程上调用onCancelled(Object).
代码:(在Android 2.2设备上测试过)
protected Void doInBackground(Void... params) {
Log.d(TAG, "started doInBackground()");
while (!isCancelled()) {
boolean ret = cancel(true);
Log.d(TAG, "cancel() returned: " + ret);
}
Log.d(TAG, "returning from doInBackground()");
return null;
}
Run Code Online (Sandbox Code Playgroud)
Logcat输出
04-15 21:38:55.519: …Run Code Online (Sandbox Code Playgroud)