前回の続きということで、新しくなったCASA libのGroupLoadについて福岡てら子で述べたことをあらためてまとめてみます。
発表時にはGroupLoadでは複数の外部ファイルを一括して管理することができて便利ですよね、ということでCasa frameworks時と少し変わった記述の内容などを説明しました。しかし‥その後に失態をやらかしてしまったことに今気付いちゃった。
それは「このクラスでは読み込み先のファイルサイズを総て事前に計算したり」はしないということです。今回のまとめであらためて色々確認してみたら、GroupLoadでのprogress.percentageによるパーセント表示は単に100を総アイテム数で割ったもので、各ファイルのサイズには比例しないものだということが確認できたのです。
最初からしとけよ、ということなんだけどまあこんなもんです。勝手な思い込みを人前で晒してしまうというのは恥ずかしいね‥ホントすいません。なので
「GroupLoadでは一斉にロードを始めてサーバに負荷をかけたりしません」。
CASAは悪くないんです、悪いのはこの私‥
一応、GroupLoadインスタンスにaddLoadでプッシュされた各ファイルのパーセンテージの振り分けが確認できるスクリプトの例をのっけておきます。これそのままではいけないですけどね。XMLのパスとか。
package {
import flash.display.MovieClip;
import flash.events.*;
import org.casalib.events.LoadEvent;
import org.casalib.load.DataLoad;
import org.casalib.load.GraphicLoad;
import org.casalib.load.GroupLoad;
public class Main extends MovieClip {
protected var _xmlLoad:DataLoad;
protected var _xmlPath:String = "http://feeds.example.com/rss";
protected var _groupLoad:GroupLoad;
protected var _apiXML:XML;
public function Main() {
super();
_xmlLoad = new DataLoad(_xmlPath);
_xmlLoad.addEventListener(LoadEvent.COMPLETE, this._onXmlLoad);
_xmlLoad.start();
_groupLoad = new GroupLoad();
_groupLoad.addEventListener(LoadEvent.PROGRESS, this._onProgress);
_groupLoad.addEventListener(LoadEvent.COMPLETE, this._onComplete);
}
protected function _onXmlLoad(e:LoadEvent):void {
_apiXML = _xmlLoad.dataAsXml;
//namespace ns= "http://search.yahoo.com/mrss/";
//use namespace ns;
//var apiXML_list:XMLList = _apiXML..thumbnail.@url;
var list_num:int = apiXML_list.length();
for (var i=0; i<list_num; i++) {
var _image:GraphicLoad;
_image = new GraphicLoad(apiXML_list[i].toXMLString());
_groupLoad.addLoad(_image);
_groupLoad.loads[i].addEventListener(LoadEvent.PROGRESS, this._onItemProgress);
_groupLoad.loads[i].addEventListener(LoadEvent.COMPLETE, this._onItemComplete);
}
_onLoadStart();
}
protected function _onLoadStart():void {
trace("_onLoadStart");
_groupLoad.start();
}
protected function _onItemProgress(e:LoadEvent):void {
//trace("Item is " + e.progress.percentage + "% loaded at " + e.Bps + "Bps.");
}
protected function _onItemComplete(e:LoadEvent):void {
trace("_onItemComplete");
}
protected function _onProgress(e:LoadEvent):void {
trace("Group is " + e.progress.percentage + "% loaded at " + e.Bps + "Bps.");
//trace(e.target.loads[0].progress.percentage);
//trace(e.target.loads[0].loaded);
}
protected function _onComplete(e:LoadEvent):void {
trace("_onComplete");
}
}
}
てら子の時に晒したスクリプト例では各ファイルパスを一つひとつaddLoadしてましたが、ここではfor文の中に入れてます。そしてQueueLoaderよろしくグループ全体だけでなく各アイテムにもLoadEvent.PROGRESS&LoadEvent.COMPLETEでリスナー登録してます。GroupLoadにプッシュされた各ファイルは「_groupLoad.loads[i]」みたいな感じで扱えます。
こうやって各ファイルがロード完了する毎にtrace文で区切られた出力を見ると均等に振り分けられたパーセンテージが確認できるというわけ。(12個のファイルだったら一つのファイルがロード完了すると8.3333334%となる)
これまた勝手な責任感からこんなまとめをしてしまいましたが、結果としては認識が深まって良かったかと。これでめでたしめでたしとしたかったのですが、ちょっと気になる現象が。それはたまに「グループ全体のprogress.percentageが100%を超えることがある」ということ。
_image = new GraphicLoad(apiXML_list[i].toXMLString());
_groupLoad.addLoad(_image);
これを
_groupLoad.addLoad(new GraphicLoad(apiXML_list[i].toXMLString()));
こう書き換えると正されたりもするんだけど、これでも時々怪しい‥
ちょっと試した限りではQueueLoaderではそういうことはなかったけど‥ライブラリの比較とかデリケートすぎるなあ。単純にテスト環境に問題があったのかもしれないが、そういうこともあると確認されたのはむしろ良かったのか。ではそういうことでw