AysncTask取消自己仍然调用onPostExecute()
打完电话后AsyncTask.cancel(true)
从内部doInBackground()
而不是调用onCancelled()
,Android把onPostExecute()
但根据文件:
调用此方法会导致onCancelled(Object)
被后在UI线程上调用doInBackground(Object[])
的回报。 调用此方法可确保永不调用onPostExecute(Object)
。
这是Android的错误吗?
更多观察:
cancel(false)
将按照文档中的规定工作。 cancel(true)
不会调用onPostExecute()
,也不会抛出下面的logcat跟踪中看到的InterruptedException
。 cancel(false/true)
从任何线程调用有时onCancelled()
甚至在doInBackground()
返回。 这显然违反了文件,其中规定: 调用此方法将导致在doInBackground(Object[])
返回后在UI线程上调用doInBackground(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;
}
Logcat输出
04-15 21:38:55.519: D/MyTask(27597): started doInBackground()
04-15 21:38:55.589: W/AsyncTask(27597): java.lang.InterruptedException
04-15 21:38:55.589: W/AsyncTask(27597): at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1254)
04-15 21:38:55.589: W/AsyncTask(27597): at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:219)
04-15 21:38:55.589: W/AsyncTask(27597): at java.util.concurrent.FutureTask.get(FutureTask.java:82)
04-15 21:38:55.589: W/AsyncTask(27597): at android.os.AsyncTask$3.done(AsyncTask.java:196)
04-15 21:38:55.589: W/AsyncTask(27597): at java.util.concurrent.FutureTask$Sync.innerCancel(FutureTask.java:293)
04-15 21:38:55.589: W/AsyncTask(27597): at java.util.concurrent.FutureTask.cancel(FutureTask.java:75)
04-15 21:38:55.589: W/AsyncTask(27597): at android.os.AsyncTask.cancel(AsyncTask.java:325)
04-15 21:38:55.589: W/AsyncTask(27597): at com.example.test.TestActivity$MyTask.doInBackground(TestActivity.java:31)
04-15 21:38:55.589: W/AsyncTask(27597): at com.example.test.TestActivity$MyTask.doInBackground(TestActivity.java:1)
04-15 21:38:55.589: W/AsyncTask(27597): at android.os.AsyncTask$2.call(AsyncTask.java:185)
04-15 21:38:55.589: W/AsyncTask(27597): at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
04-15 21:38:55.589: W/AsyncTask(27597): at java.util.concurrent.FutureTask.run(FutureTask.java:137)
04-15 21:38:55.589: W/AsyncTask(27597): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1068)
04-15 21:38:55.589: W/AsyncTask(27597): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:561)
04-15 21:38:55.589: W/AsyncTask(27597): at java.lang.Thread.run(Thread.java:1096)
04-15 21:38:55.589: D/MyTask(27597): cancel() returned: true
04-15 21:38:55.589: D/MyTask(27597): returning from doInBackground()
04-15 21:38:55.659: D/MyTask(27597): onPostExecute()
有一个例外,因为你调用cancel(true)向运行doInBackground()的线程发送一个中断 - 但是,在这种情况下,你是从doInBackground()中调用cancel(true),从而导致线程立即发送打断自己。
您的代码在Android 2上运行,但是您正在引用Android 4的文档。问题是cancel()上的行为在Android 2和Android 4之间发生了变化。
Android 2.3.7 onPostExecute:
在doInBackground之后在UI线程上运行。 指定的结果是doInBackground返回的值,如果任务被取消或发生异常,则返回null。
Android 4.0.1 onPostExecute:
在doInBackground之后在UI线程上运行。 指定的结果是由doInBackground返回的值。 如果任务被取消,则不会调用此方法。
您应该返回null并将onPostExecute中的返回值对待。
链接地址: http://www.djcxy.com/p/58841.html上一篇: AysncTask cancelling itself still calls onPostExecute()
下一篇: Creating a Workbook with a custom name without saving it to disk