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の次で修正される。

  • kinneko@転職先募集中の日記](http://d.hatena.ne.jp/kinneko/20100730/p9)

で教えてもらった話。

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

Android
Java

published

Ads

Read more!

amay077

Microsoft MVP(Xamarin). フルリモートワーカー. Geospatial Mobile app developer. Love C#.

amay077 amay077