Experiments Never Fail

AsyncTask の cancel メソッドにはバグがあるよ、Froyo(2.2)以降で直されるかもよ→Gingerbread(2.3)で直ったよ

2010.12.16 追記 #

Gingerbread (Android 2.3) では修正されているとの事です。

Romain Guy:
This AyncTask's cancel bug was fixed in Gingerbread?
It was fixed in Gingerbread yes :)
via groups.google.com - AyncTask's cancel bug was fixed in Gingerbread?

2.3 のコードが公開されれば、2.2 でも ”正しく” 修正できますね。

[AsyncTaskの cancel()には問題があり、Froyoの次で修正される。

で教えてもらった話。

Eric Mill:

  1. onDestroy(), calls task.cancel()

  2. task's onPostExecute runs, isCancelled() returns false, so I have
    no conditional to stop the flow

and that's it. onCancelled never runs.

via groups.google.com

Activity.onDestroy で AsyncTask.cancel を呼ぶと、

から、なんとかしてぇ!ということらしい。

んで Google の Romain さんが、

Romain Guy:
There was a race in the cancel() code that we fixed post-froyo.

と言ってるけど、"post-froyo" というのは、
Post-froyo means after froyo, so not in froyo :)
だそうで、”Froyo の後” つまり、Gingerbread (Android 2.3) での修正らしい。
(けど "gingerbread!" って断言してないからもっと先かも知れないなあ。)
なので、しばらくは、いや当分は自力で flag でも用意して回避するしかないみたい。
けど AsyncTask.cancel は final メソッドで override できないから、何とも不自然なコードになりそう。。。

published at tags: Android Java