増子良太のブログです

増子良太が書いているブログです。テーマをしぼらず、思いついたものをただひたすら書いていきます。

AsyncTaskにつまずいた

      2013/06/28

こんにちは!rmascoです。

本日はAndroidアプリ実装中にAsynkTaskにつまずいたというお話を書きたいと思います。

実装しようとしていた処理はサーバからデータを受け取り、ListViewを更新するという大したものじゃあありません。サーバからデータを取得する際に、時間がかかってしまう場合もあります。その場合、AndroidのUIスレッドは5秒以上処理が戻ってこない場合にはエラーのダイアログが表示されてしまいます。

解決するために最も使われるのがAsynkTaskというクラスを作成し、別スレッドでサーバからのデータ受信など時間がかかる処理を行います。AsynkTaskの使用方法などは別のサイトを見てもらうとして、doInBackgroundメソッドの中でListViewのデータであるArrayAdapterを更新しようとすると、下記エラーが表示されました。

なんでだなんでだ!と思いながら調べてみると、UIスレッドは他スレッドからの更新、変更などが発生すると、上記exceptionをはくと。
もうこの時点で意味がわかりませんでした。スレッド?スレッドねぇ。

ようするに、UIの更新はUIを作成したスレッドでしか更新などができなくて、AsynkTaskは別スレッドを作成して、処理を行っているから、その中からは変更できないよということみたいです。

じゃあどうしたらいいんでしょう。

実は、 doInBackgroundメソッドは別スレッドですが、その後呼び出されるonPostExecuteメソッドはUIスレッドから呼び出される。つまりはUIスレッドってことですね。

というわけで、doInBackgroundメソッドでやっていた処理をonPostExecuteメソッドに移して確認、無事エラーもなく実行できました!

Androidはまだまだ奥が深い。。。

 - Android