2011/02/27

WeatherNowでのAppWidget更新バグについて

WeatherNowでは同じホームウィジェットを複数配置しそれらが同時に更新(「Loading...」表示)した場合、全てがきちんと更新されないバグが存在していました。それの原因と対策について。もっとも、きちんとした対策は出来ていないのですが。


まずWeatherNow 1.1.2時点でのコードについてですが、noxiはウィジェットを更新するサービス内でRunnable-Handlerを使っていました。昔このコードを書いた時は(今もそうですが)ホームウィジェットの画面描画諸々を全く理解していない状態で書いていたので、普通にアプリでのデータダウンロード・画面描画と全く同じ感覚で書いていました。結論として、少なくともHandlerを使う必要は全くありませんでした。

・WeatherNow 1.1.2時点でのAppWidget更新用Serviceのイメージ
(ダメな例)



このコードは同時に複数のホームウィジェットを更新処理に移せましたが、原因はよく分かりませんが更新がうまくいかず最後に更新処理に入った物だけウィジェットの画面が描画されました。
ホームウィジェットの場合このコードからHandlerを外してRunnable内でRemoteViews-AppWidgetManagerの更新を行える様で、Handlerは全くの不要物だったようです。

じゃあRunnableも外して

とした場合どうなるのかというと、一度に一つのホームウィジェットのみ更新処理に入りますがきちんと更新されます。ホームウィジェット一つの更新処理が終わると次のホームウィジェットの処理に入る様で、同時更新にはなりません。更新順序はちゃんと記録されていて(?)、恐らく途中でタスクキルされない限りは順番通りに全て更新される様です。
ただしRunnableを使わない副作用として、更新処理に時間がかかると「時間かかりすぎだゴルァ」ってメッセージが表示されます。(でもRunnable使うと情報が混ざる...どうしろと...と思った)

自分用メモ含めた中途半端な記事でした。