BulkLoaderを触ってみたよ。

追記: ココに書かれているバグは r176 - bulk-loader - Google Code でクローズされています。

巷でウワサ?の BulkLoader がバージョンアップしたみたいなので触ってみたよ。

複数の種類の複数のファイルを同じインターフェイスで扱える。 ってライブラリらしく、使い勝手はかなり良い感じ。

//  名前を付けてインスタンスを生成
var loader = new BulkLoader('default');
//  取得するURLを指定
//  typeを指定しないと自動判別になるらしいよ
loader.add('http://twitter.com/statuses/user_timeline/7372692.atom',
{
    id: 'twitter-soundkitchen',
    type: BulkLoader.TYPE_XML
});
//  complete, progress, errorのリスナーを登録
//  なかでtraceしてるだけなので省略
loader.addEventListener(BulkLoader.COMPLETE, _onComplete, false, 0, true);
loader.addEventListener(BulkLoader.PROGRESS, _onProgress, false, 0, true);
loader.addEventListener(BulkLoader.ERROR, _onError, false, 0, true);
//  ロード開始
loader.load();

使い方が簡単なのはありがたい。 複数個の取得も add するだけで簡単に出来る。

var loader = new BulkLoader('default');
//  取得したいURLをしこたま詰め込む
loader.add('http://twitter.com/statuses/user_timeline/7372692.atom',
{
    id: 'twitter-soundkitchen',
    type: BulkLoader.TYPE_XML
});
loader.add('http://twitter.com/statuses/user_timeline/3307901.atom',
{
    id: 'twitter-yoshuki',
    type: BulkLoader.TYPE_XML
});
loader.add('http://twitter.com/statuses/user_timeline/5922142.atom',
{
    id: 'twitter-kishir',
    type: BulkLoader.TYPE_XML
});
//  リスナーを登録してロード

複数個でも本当に簡単。ちょっと感動に酔いしれた。 が、ここでちょっとした事に気づいた。 まずはログファイルの中身を見て頂いてから。

[ProgressEvent bytesLoaded=3640 bytesTotal=0]
[ProgressEvent bytesLoaded=3640 bytesTotal=0]
[ProgressEvent bytesLoaded=7984 bytesTotal=0]
[ProgressEvent bytesLoaded=7984 bytesTotal=0]
[ProgressEvent bytesLoaded=9432 bytesTotal=0]
[ProgressEvent bytesLoaded=9432 bytesTotal=0]
[ProgressEvent bytesLoaded=10880 bytesTotal=0]
[ProgressEvent bytesLoaded=10880 bytesTotal=0]
[ProgressEvent bytesLoaded=12730 bytesTotal=0]
[ProgressEvent bytesLoaded=13474 bytesTotal=0]
[ProgressEvent bytesLoaded=13474 bytesTotal=0]
[ProgressEvent bytesLoaded=14922 bytesTotal=0]
[ProgressEvent bytesLoaded=14922 bytesTotal=0]
[ProgressEvent bytesLoaded=17818 bytesTotal=0]
[ProgressEvent bytesLoaded=17818 bytesTotal=0]
[ProgressEvent bytesLoaded=19266 bytesTotal=0]
[ProgressEvent bytesLoaded=19266 bytesTotal=0]
[ProgressEvent bytesLoaded=22162 bytesTotal=0]
[ProgressEvent bytesLoaded=22162 bytesTotal=0]
[ProgressEvent bytesLoaded=23610 bytesTotal=0]
[ProgressEvent bytesLoaded=23610 bytesTotal=0]
[ProgressEvent bytesLoaded=25584 bytesTotal=0]
[ProgressEvent bytesLoaded=33568 bytesTotal=38844]
[ProgressEvent bytesLoaded=33568 bytesTotal=38844]
[ProgressEvent bytesLoaded=36464 bytesTotal=38844]
[ProgressEvent bytesLoaded=36464 bytesTotal=38844]
[ProgressEvent bytesLoaded=38844 bytesTotal=38844]
[ProgressEvent bytesLoaded=38844 bytesTotal=38844]

どうやら最後のファイルを取得し始めるまで、 bytesTotal の値が取れないらしい。 直列に取りにいってるんだから、しょうがないと言えばしょうがない。 でも、これだとローディングとか表示出来ないよ。 何かやり方があるんだろうと、ソースコードを散策してみた。

色々見てみると、 BulkLoader 自体が、 今現在、どの程度ロードしているか?を取得するメソッドを持ってるみたい。 なので、イベントからひっこ抜かなくても、 BulkLoader から取ってこれる。 しかも、ありがたい事にわざわざプロパティとしてインスタンスを保持していなくても、 BulkLoader 自体でインスタンスを管理してくれていて、 最初につけた名前で逆引き出来るようになってる。

//  newした時の名前で取得出来る
var loader = BulkLoader.getLoader('default');

で、進行状況を取得出来るメソッド群の中で、 気になったのが bytesTotalCurrent ってメソッド。 なんか名前的にも、ものすごくそれっぽい。 さっそく確認してみる。ので、 _onProgress の中身を以下のようにしてみた。

private function _onProgress(evt:BulkProgressEvent):void
{
    var loader:BulkLoader = BulkLoader.getLoader('default');
    //  順番に並べて吐き出す
    trace('bytesLoaded:' + loader.bytesLoaded,
          'bytesTotal:' + loader.bytesTotal,
          'bytesTotalCurrent:' + loader.bytesTotalCurrent);
}

で、出た結果がコレ。

bytesLoaded:6536 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:6536 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:12730 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:13478 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:13478 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:20718 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:20718 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:25062 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:25062 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:25584 bytesTotal:0 bytesTotalCurent:0
bytesLoaded:26332 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:26332 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:32124 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:32124 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:36468 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:36468 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:37916 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:37916 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:38844 bytesTotal:38844 bytesTotalCurent:0
bytesLoaded:38844 bytesTotal:38844 bytesTotalCurent:0

あからさまにおかしいだろ!これ。最後まで0って何だよ!

そう言えば、 berian が同じような事言ってたなぁ。 解決したんだろうか?どうなんだろ?

どうなったか結果を聞いてないけども、 どうせならって事でデバッグ開始。 BulkLoader 自身は _bytesTotalCurrent なプロパティで値を保持しているので、 それを計算してる場所を探してみる。 って思ったら、早速バグ部分を発見しちゃった。

実際に計算してるのは getProgressForItems なメソッド内で、 その中の最後のほうで BulkProgressEventsetInfo をコールしてるんだけども、 そこで計算結果を渡し損ねてる。 本当なら localBytesTotalCurrent を渡すべきなのに、 bytesTotalCurrent を渡しちゃってる。 ので、これを直してもう一度テストしてみる。diffはこんな感じ。

Index: br/com/stimuli/loading/BulkLoader.as
===================================================================
--- br/com/stimuli/loading/BulkLoader.as        (revision 175)
+++ br/com/stimuli/loading/BulkLoader.as        (working copy)
@@ -930,7 +930,7 @@
             localWeightPercent = localWeightLoaded / localWeightTotal;
             if(localWeightTotal == 0) localWeightPercent = 0;
             var e : BulkProgressEvent = new BulkProgressEvent(PROGRESS);
-            e.setInfo(localBytesLoaded, localBytesTotal, bytesTotalCurrent, localItemsLoaded, localItemsTotal, localWeightPercent);
+            e.setInfo(localBytesLoaded, localBytesTotal, localBytesTotalCurrent, localItemsLoaded, localItemsTotal, localWeightPercent);
             return e;
         }

この状態でテストした結果はこうなったよ。

bytesLoaded:5088 bytesTotal:0 bytesTotalCurent:13260
bytesLoaded:5088 bytesTotal:0 bytesTotalCurent:13260
bytesLoaded:13260 bytesTotal:0 bytesTotalCurent:13260
bytesLoaded:14004 bytesTotal:0 bytesTotalCurent:26114
bytesLoaded:14004 bytesTotal:0 bytesTotalCurent:26114
bytesLoaded:24140 bytesTotal:0 bytesTotalCurent:26114
bytesLoaded:24140 bytesTotal:0 bytesTotalCurent:26114
bytesLoaded:26114 bytesTotal:0 bytesTotalCurent:26114
bytesLoaded:26858 bytesTotal:38844 bytesTotalCurent:38844
bytesLoaded:26858 bytesTotal:38844 bytesTotalCurent:38844
bytesLoaded:29754 bytesTotal:38844 bytesTotalCurent:38844
bytesLoaded:29754 bytesTotal:38844 bytesTotalCurent:38844
bytesLoaded:35546 bytesTotal:38844 bytesTotalCurent:38844
bytesLoaded:35546 bytesTotal:38844 bytesTotalCurent:38844
bytesLoaded:38844 bytesTotal:38844 bytesTotalCurent:38844
bytesLoaded:38844 bytesTotal:38844 bytesTotalCurent:38844

どうやら上手く動くようになった。 これでメンドクサイながらも全体のローディング状況を監視出来るようになったよ。 めでたしめでたし。

最後に bulk-loader - Google Code からリリース版を落としてみたら、 それにも同じバグが残ってたよ。同じリビジョンだからあたりまえだけども :-P

なので、使ってる方は気を付けてくださいまし。 new isssueにはつたない英語であげておきました :-)

Posted at: 
2008/03/06 02:57:35
0 Comments
0 TrackBacks
Tags: 
ActionScript
BulkLoader
Flash
Trackback: 
http://humming.via-kitchen.com/2008/03/06/tried-using-bulkloader-on-actionscript3/trackback/

TrackBacks

まだ登録されていません。

Comments

まだ登録されていません。

Add Comment

Add Comment