Android Ver4以降メインスレッドからネットワーク処理は行えない!

作成してるのアプリの大部分がWEB情報を取得して見やすく成型して
表示するアプリなんですが、ユーザーから送られてくるクラッシュレポートをみてると
機種によって障害がでている模様。

レポートをみると、
NetworkOnMainThreadExceptionがでているようだ。


こちらでもがちゃがちゃテストしてみると・・・・でない・・・でない
・・・・あ、たしかに出た。
??けど以前テストしたのになー、
しかも毎回でないし、とか思いながら

ちょっとググって見ると
711fumiさんという方のブログにもろその記事が
そこから派生するリンクをごそごそ追ってみて理解しました。

なるほど、「NetworkOnMainThreadException」という名のとおり
メインスレッドからネットワーク処理を行うことを許していないということで
バージョン4以降に適用されたらしい。


なるほどたしかに、ダメだった機種は持ってる中で唯一新型のNexsus7。

しかも現象がわかりにくくしてたのが

1画面目がリスト、2画面がその詳細を表示しており、
高速化するために2画面目の各詳細情報を、
1画面目の裏で上から順に非同期に取得していて

①リストが選択された際、キャッシュした情報あればそれを表示。
  (故に画面遷移は高速)
②なければ、そのページのみ先に、DefaultHttpClientでデータとりに行く
  (故に画面遷移は低速)

ようにしていたアプリの構造。

つまり、キャッシュ情報にアクセスした場合は正常に動作するけど
操作に間に合わなくて②のケースになった場合、Exceptionがでていたみたいで

Nexsus7は、他マシンより高性能なのであまり処理に時間がかからず
②のケースになることが少なく、普通に触ってる分にはエラーに気づかなかったと
そういうことらしい。

とにかく、メインスレッドからネットワーク処理を行うことでおこられてるので
とりあえず、すでに別処理で利用してたrunメソッドに、処理放り込んだら正常動作しました。

711fumiさんとブログおよび、そこに張ってくれてるリンクには
AsyncTaskを使用した例を書いてくれてます。

こちらのほうがちゃんとした、対処方なので同様にはまった方は
そちらをみてみるといいと思います。。

なるたけ古い携帯で動かしてそっちで大丈夫なら
(新しいほうが、機能大なりなので)
まあ新しいのも大丈夫やろうという感覚でいましたが
その感覚も捨てんといかんなー。

調べてみたら、他のアプリも同様の動きをさせると皆落ちました!
もー、バージョンアップでこういう修正は、ほんまやめて欲しいわー。