http://developer.android.com/reference/android/os/AsyncTask.html#execute(Params...)
を見ると、Honeycomb 以降のどこかでAsyncTask のバックグラウンド処理をバックグラウンド用の
単一スレッドで逐次実行するように変更することを計画していると書かれています。これが 4.0.3 で
実際に変更されたのではないかと予想しています。
そこで想像なのですが、今回取り上げている AsyncTask 以外にも別の AsyncTask が実行中だったり
しないでしょうか。もしそうだとすれば、先に動き始めた doInBackground が完了するまで次の
doInBackground は呼ばれません。
もしこのような状況なのであれば、 API Level 11 で追加された AsyncTask#executeOnExecutor を使って
独自の Executor を指定することで回避できるのではないかと思います。
2012/1/17 トムキャット <daily...@gmail.com>:
> --
> このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
> このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
> このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
> 詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。
>
--
YAMAZAKI Makoto
もう少ししらべてみました。
Gingerbread と ICS で AsyncTask#execute のコードを比べてみたところ、前者では
ThreadPoolExecutor で実行され
後者では SerialExecutor で実行されるように変更されていました。ただし、 ICS では、ActivityThread クラスで、
targetSdkVersion が 12 以下の時は @hide な API を使ってAsyncTask#execute が
ThreadPoolExecutor で実行する
ように変えるコードも入っていました。
つまり、単純に端末のOSのバージョンで決まるのではなく、アプリの targetSdkVersion(指定してなければ minSdkVersion)
が何になっているかも AsyncTask#execute の挙動に影響します。
Honeycomb のソースコードがないので実際に試してみないと分かりませんが、
予想では API 13(もしかしたら 11かも)以上の OS && 13 <= targetSdkVersion
の時にSerialExecutor が使われるんではないかと
思っています。
--
YAMAZAKI Makoto
API Level 15 の端末で実際に動かしてみましたが、特に問題なく doInBackground が呼ばれています。
以下のようなプロジェクトを作って試しました。
https://github.com/zaki50/Async15
このプロジェクトを実機で実行すると、画面にはプログレスが表示され、 doInBackground で書いている
ログもlogcatに出ています。
この状況で一番怪しいのは、やはり AsyncTask が複数動いていることなんではないかと思います。
クラスは一つでも複数回実行されたりしていないでしょうか。
2012/1/18 トムキャット <daily...@gmail.com>:
高見知英です。
> あるバージョンからデフォルトでSerialExecutorが使われるという仕様はいいのですが、STYLE_SPINNERのプログレスダイアログ
> と一緒に使うと問題が起こる→executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)を使わないといけ
> ない、というのが奇妙に思えます。
これですが、本当にProgressBarは関係していますか?
わたしもAndroid4.0(API Level14、Galaxy Nexus実機)でおなじことをしてみましたが動いています(ProgressBarは期待通り表示され、doInBackgroundは実行された)。
・ProgressBarは本当に事象に関係しているのか
・自分の見落とした部分になにか別の問題はないか
以上二点、今一度確認してみてはいかがでしょうか。
ご確認のほど、よろしくお願いいたします。
--
横浜IT勉強会 高見知英
メール:ch...@tamago.soup.jp
Web:http://Onpu.jpn.ch/
Tw: @TakamiChie ハマっち:16872
Skype:TakamiChie
2012/01/18 18:30 "トムキャット" <daily...@gmail.com>:
解決してよかったです。
Android 3.2以降の端末で targetSdkVersion(minSdkVersion) を13以降にすると
AsyncTask#execute の呼び出しでは doInBackground が並行実行されないということが
わかったので私も収穫ありでした。
検証用コードには大して時間かかってないのでだいじょうぶです。
2012/1/19 トムキャット <daily...@gmail.com>: