2013年7月17日水曜日

【Android】ViewPagerについて

ViewPagerとはAndroidの標準ギャラリーのように
左右フリックでコンテンツを切り替えるViewである.

このViewPagerではコンテンツを表示する際に
自動的に前後のポジションのコンテンツを読み込みに行く.
例えばposition:3のコンテンツを表示させる場合,
同時にposition:2,4のコンテンツも取得する.

こんな便利なViewがあるなんて!と思ったのだが,
使い方を誤ると大変なことになりそうだと気づく.

同時に3つまでコンテンツを保持する関係上,
大きな画像を扱う場合はメモリ管理に注意しなければならない.

もしコンテンツがインターネッツ上にある場合やデコードが必要な場合等々,
処理に時間がかかる場合は処理を別スレッドに任せないといけない.

これは当然なのだが,ただ何も考えずに別スレッドにしただけでは
フリック操作をしまくることでスレッドがたまり,
きちんと排他処理をしなければ処理能力不足やソケットの取り合いになり,
排他処理をしても,スレッドがスタックされていく.

必要なスレッドとそうでないもはや古くなってしまったスレッドとの判断が必要.
だが,今表示されているポジションだけでなく,
その前後のポジションも読みに行くという仕様がここではネックになる.


そこで,以下のようなアルゴリズムを考えた.

まず各スレッドにユニークなIDをもたせる.これはスレッドIDでも構わない.
次にそのスレッドでユニークなIDの最新3件(表示ポジションと前後ポジション)を
記憶するためのリストをアクティビティに持たせる.
 →これはLinkedListでも配列でもArrayListでも自分が使いやすいやつでいいが,
  順番というものを意識するため今回は意図的にLinkedListにしている.
スレッドを生成したら即Synchronizedでロックをし,順番待ちしてもらう.

順番がまわってきたら最初にアクティビティが持ってる最新3件のリストに自分が入ってるかどうか確認する.
入っていなければそこで終了.
入っていれば重たい処理を行い,HandlerでUIに反映させる.

なお,ViewPagerはListViewなどと違ってViewが再利用されないので,
重たい処理を行わせた後で表示していいかどうかの判断を行う必要はない(と思う).


以下,上記日本語のコード化
View内のレイアウト配置等,今回不要かつ紛らわしいところは省いている.


本当の本当に終わり

0 件のコメント:

コメントを投稿