1

サムネイルを生成するためのルーチンを作成しました。基本的なフローは次のとおりです。

1) get all jpg url from directory
2) iterate all the url
   2.1) load url into a bitmap using URLRequest
   2.2) resize the bitmap to small size
   2.3) encode the bitmap into jpg
   2.4) write the jpg into a file
3) update list dataprovider with thumb url and refresh

これは 1 つのファイルでは機能しますが、2 つ以上のファイルでは失敗します。これは、ステップ 2.1 から 2.4 が非同期メソッドを含む静的関数に含まれているためです。2.1 は非同期、サイズ変更は非同期、エンコードは非同期で、それぞれが完了イベントを待機する無名関数を介してネストされています。

次の反復がステップ 2.1 に到達するまでに、新しい URL が渡され、前の反復からのコールバック メソッドがそれを使用します。

この問題に対するより良いアプローチは何ですか? ステップ 2 を実行するクラスを作成し、静的関数の代わりに毎回インスタンス化するだけですか? ずいぶんと重い気がします。

4

1 に答える 1

0

あなたが言ったように、関数は状態を保存する必要があり、すべての一連の操作に共通のデータが必要です。これがまさにクラスが発明された理由です。

adobe が AsyncToken などで使用しているため、この「重い」アプローチを使用しても申し訳ありません。このコードがプログラムのパフォーマンスのボトルネックにならない場合は、間違いなくクラスを使用する必要があります。これにより、コードがより明確になります。

ただし、ここでパフォーマンスが重要であると思われる場合は、反復を非同期に開始することができます。開始された操作の最大数に達した場合は、そのうちの 1 つが完了するまで新しい操作を開始しないでください。その場合、そのようなクラスのプールを作成して再利用できます。

ただし、あなたの場合、ビットマップ操作の期間は単純なクラスのインスタンス化と比較して非常に大きく、インスタンス化のオーバーヘッドを無視できると思います)。

前の操作が 100% 完了するまで、新しい操作を開始しないでください。これは以前のバリアントの特殊なケースです。その場合、メイン クラスは提案された新しいクラスとして機能し、それ自体を再利用し、操作の最大制限は 1 です。

于 2013-02-17T07:58:25.783 に答える