例えば、検索結果の写真を0.5秒ごとに1枚表示していく場合、データのロード、写真のロードそれぞれにかなり時間がかかるので、バッファを作るという処理が必要になる。
考え方としては、とりあえずローダーを64枚分用意して、表示に先駆けて画像をロードすることにする。
64枚の先読みが完了して、1枚目から表示をはじめ、最後の64枚目を表示し終えて、最初の1枚目のローダーの表示に戻るのには32秒かかることになる。
だからこの場合、1つのローダーが32秒に1枚ずつ写真をロードして行くことができれば、滞りなく写真を表示して行くことができる。
やることとしては、
・FlickrからXMLをダウンロードする。
・Flickrからキャッシュ用に写真をダウンロードする。(表示とは無関係に先に写真を読み捨てしておく。)
・キャッシュを利用して、バッファの写真を準備する。(ローダーを非表示にしている間に、次に表示する写真を準備しておく。)
・写真を順番に表示する。
といったことがある。
それぞれを並行して処理して行き、順番に写真を表示している間に、必要な写真をきちんと準備しておくということが目的になる。
なんにしても、最初にXMLデータをロードすることが必要なので、新規にMakeFlickrDataStockというクラスを作って、指定されたサーチ条件のXMLデータをストックして行くことにする。
これは、1ページ分のXMLをロードして、それが完了したところで、2ページ目をロードする、といった具合で一人で勝手にデータをロードして行く。
ただし、検索結果しだいではページ量が膨大になってしまう場合がある。
その場合、XMLのロードでCPUがフル回転してしまうので、リミットを設定して、一気にロードするページと、ページの表示が終了した時点で、追加ロードするページを分けておく。
ページ単位のXMLの各ノードは、ページ番号のインデックスで配列に保存されて行き、写真をロードするときのURLを引き出すのに利用される。
とりあえず、1ページ分のデータが揃えば、写真のロードの並行作業が始められるので、1ページ目のデータをダウンロードしたところでコールバックを呼び、サムネイル画像のロードを始める。
その後も、設定されたリミットページまでXMLのロードは続けられる。
表示用の処理は、ローダーを1ページの写真数分準備することから始まる。
そのローダーに、XMLから抽出したURLを渡して、サムネイルをロードする。
1ページ分のサムネイルのロードが完了したところで、キャッシュのロード状況を確認する。
XMLの2ページ目のデータのロードが完了した時点で、並行してキャッシュデータのロードを始めるようになっている。
キャッシュデータのロード用にmakeFlickrThumbnailCacheクラスを作っている。
これは指定された1ページ分の写真データをロードして、ロードし終わったらアンロードする。
これによってローカルPCのハードディスクに写真データが前もってキープされるので、表示処理で写真データを呼び出すときには、サーバにアクセスしなくてすむようになる。
2ページ目のキャッシュの作成が完成していると、表示処理はもう始められるので、タイマーを設定し、0.5秒間隔でサムネイルを1枚ずつ表示して行く処理を開始する。
写真をロードしたローダーを、flashplayer9のdisplaylistに追加すると、ディスプレイ上に写真が表示されることになる。
逆に、displaylistからローダーを削除すると、ローダーは残ったまま、表示だけ消える。
そんな感じで、1枚目が表示された後、2枚目を表示し、その際1枚目の表示は消すという処理を、1ページ分用意したローダーにたいして、繰り返し行って行く。
こうして、ローダーが非表示になっている間に、次のページの写真をロードして行く。
1ページ分の写真の表示が完了するたびに、追加の1ページ分のXMLデータとキャッシュのロードが行われる。
キャッシュが足りなくなるとスムーズに表示することができなくなるので、表示されるターゲットが1ページ分一回りしたところで、キャッシュのロードが完了しているかを確認する。
完了していないときは、待ち状態に入るようにしておく。
表示非表示を切り替えるときには、表示用のローダーのロード処理が終わっているかを確認する。
そうしないと、何もロードされていない白いローダーが表示されてしまうことになる。
ロード処理が終わっていないときには、こちらも待ち状態に入るようにしておく。
(キャッシュのロードが完了していれば、表示用のロードの準備がまに会わないことはほとんどない)
大体こんな感じでサンプルは以下。
1ページの写真の枚数を64枚に設定し、キャッシュが2ページまでたまるのを待ってロードが始まるので、合計128枚のサムネイルのロードが完了するまで表示は始まらない。
ちょっと待つことになる。
(Flash CS3 の英語版の体験版で作成。AS3.0 player9)