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 を呼ぶと、

  • キャンセル時は呼ばれないハズの onPostExecute が呼ばれちゃう。
  • isCancelled は false を返すし、
  • onCancelled も呼ばれないし、

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

んで 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 できないから、何とも不自然なコードになりそう。。。