1

Android プログラミングは初めてで、スレッドの問題があります。

基本的に、50 ほどの URL からの画像を GridView に入力していますが、それらの URL は、既知の URL から JSON オブジェクトを取得するまでわかりません。URL をダウンロードするたびに (AsyncTask クラスを使用して) 多数のスレッドを起動する必要があることはわかっています。

これらのスレッドを効果的にキューに入れ、JSON スレッドが最初に実行されて終了するようにするにはどうすればよいでしょうか? その直後に 50 個のイメージ スレッドを起動したときに、そのスレッドから取得したデータを使用できますか?

4

2 に答える 2

2

50 個のスレッドを開始しないでください。シングルスレッドを使用します。これは応答性のために UI スレッドから分離する必要がありますが、複数のスレッドを生成する必要はなく、URL ごとに 1 つのスレッドを生成する必要はありません。

JSON ネットワーク呼び出しを行い、応答を解析し、(同じスレッドで) 各 URL を要求する URL をループし、結果をビットマップにデコードします。いくつかのモデル オブジェクト内でそれらを GridView のアダプターに追加すると、GridView が UI スレッドで更新されるように自動的にトリガーされます。

ここには、遅延読み込み、キャッシュ、画像の読み込み中にプレースホルダー画像を表示するなどのより良い方法がありますが、正確な実装は複雑すぎてここでは説明できません。WeakReferenceMap と LruCache を検索して、AdapterView に動的に画像をロードするためのベスト プラクティスの例を見つけてください。

于 2012-07-23T02:53:28.183 に答える
1

最初のフェッチを実行するだけで、これが完了したら、このメイン スレッドから 50 個のスレッドを起動できます。Android 3.0 以降では、UI スレッドからネットワーク通信を行うとアプリが強制AsyncTask終了されるため、JSON を取得する方法として使用できます。これが戻ると、他のスレッドが起動する可能性があります。

考慮すべきことの 1 つは、Android は強力ですが、まだ機能が制限されたデバイスであるということです。50 スレッドは、対象のハンドセットが持つより多くのリソースを使用する可能性があり、そのため、アプリがシステムによって強制終了される可能性があります (OOME などにより)。したがって、デスクトップでは 50 スレッドはあまり聞こえません。

また、IIrc、http 仕様には制限があり、1 つのリモート サーバーに対して 4 つ (?) の同時接続しかできないという制限があります。そのため、画像読み込みリクエストをキューに入れ、次々に取得することを検討してください。

于 2012-07-23T02:16:21.127 に答える