Android:Adapter.getViewでAsyncTaskは危険

メモ書き程度に残しておこうと思います。

WebAPIと連携したアプリでListViewなどを使っていると、画像を遅延ロードすることがたくさんあると思います。そこで、ListView.getViewの動作を速くするためにViewHolderを使ったりなどのテクニックが紹介されていますが、そこでAsyncTaskを使って画像をDLする仕組みを使うのは危険です。具体的にいうと、キューを使わずに、ですが。

getViewは頻繁に呼ばれるメソッドです。リストをちょっとスクロールしても呼ばれますし、ソフトウェアキーボードの出し入れなど、画面描画に関するものが使われると怒濤の如くコールされます。今回は8行表示するところで、24回もgetViewが呼ばれ、8回しか呼ばれないと思っていたAsyncTaskが24回も呼ばれていました。スクロールしたらさらに呼ばれ続けて、スレッド数が多過ぎるというエラーでアプリが落ちました。とくに、Android 3.0の大きな画面だと、画面に表示される行数の数が多いので、スマートフォンでは大丈夫だったけどタブレットだと落ちるという現象に出くわす可能性が高いです。

既にキューに取得したい画像のURLが送られているときはAsyncTaskをコールしないようにすれば、行数分だけしか呼ばれないので、滅多に落ちるということはなくなると思います。ただたくさんの画像をDLすることがわかっているのに、画像1つのダウンロード毎にAsyncTaskを呼ぶのはどうなのか?という意見もtwitterで頂いたので、確かになぁと思ってます。
そこら辺をうまいこと解決する方法を考えていきたいです。


タグ Android | パーマリンク.

コメント・トラックバック一覧

  1. どうすれば says:

    同じ内容で悩んでいる方が多いと思います。
    キューイングの方法、伝授頂きたいです。

  2. Pingback: Android:非同期にダウンロードした画像の表示方法 | 自転車で通勤しましょ♪ブログ

  3. katout says:

    上に同じく同じ問題でずっと悩んでます
    ぜひ解決方を伝授いただきたい

  4. > katout
    上のPingbackの記事を読んでください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です