2012-12-02 3 views
6

私はいくつかの画像をGridViewにロードする必要があるAndroidプロジェクトに取り組んでいます。キャッシュが存在しない場合は、イメージがキャッシュ内に存在する可能性があり、次にインターネット・サーバーに照会します。私の設計は、2つのスレッドを使用して読み込みタスクを実行することです。キャッシュ読み取り用のスレッドとダウンロード用のスレッド。したがって、UI 1を含む3つのスレッドがあります。それぞれに独自のメッセージキューがあり、ハンドラを使用して通信します。何かダウンロードしたときに、バインドされたサービスまたはカスタマイズされたスレッドのどちらを使用していますか?

私の質問は、この状況でバインドされたサービスを使用すべきかどうかです。実際には私は上記の設計を実現しており、何も間違っているとは思えませんが、GCはlogcatから推測することができます。

もう1つの問題は、DDMSを使用してスレッドを監視するといくつかのスレッドが存在することです。これは、複数のアクティビティで同じロードメカニズムが使用されているためです。私はonPause()が呼び出されている間にスレッドがメッセージループを終了するようにしましたが、私は同時に2つだけが生きていると確信しています。しかし、私はDDMSでそれらのすべてを見ることができます。 (なぜ、スレッドはまだ存在するのですか?)

つまり、私の質問は次のとおりです。このローディングタスクはバインドされたサービスの恩恵を受けることができますか?

答えて

1

なぜ、複数のスレッドを使用していますか?バックグラウンドでイメージをロードし、完了したらイメージをUIに表示する必要があります。イメージがどこから来るのかはUIには関係ありません。また、複数のスレッドを使用しても速度は向上せず、メモリを消費するだけです。単一のバックグラウンドスレッドを使用するだけです。まず、キャッシュにヒットし、ヒットしなければダウンロードします。

サービスは、UIを必要としないものを実行するためのものです。リアルタイムでUIを更新する必要がある場合、サービスはあまり意味がありません。

+0

ご返信ありがとうございます。しかし、キャッシュとダウンロードのバックグラウンドスレッドでは不十分です。このようにして、キャッシュ内のイメージは、以前のダウンロードタスクが完了するまでロードされません。 2つのバックグラウンドスレッド設計では、画像がキャッシュ内にある場合、できるだけ早く画像をロードすることができます。私が知る限り、「Bound Service」はアクティビティと通信するために使用できます。この通信は双方向通信である可能性があるため、理論的には拘束力のあるサービスがこの状況に適用されます。しかし、私が疑問に思っているのは、バインドされたサービスがより効率的かどうかです。 – Alley003

+0

サービスは特別なものではありません。スレッドを実行するには、サービスを作成する必要があります。あなたの場合、複数の(しかしバインドされた)読み込みスレッドを持ち、より速く取得することができます。これを行うオープンソースライブラリがあり、IIRCにはAOSPコードの例がいくつかあります。いずれにしても、サービスはここで使用するものではありません。 –

+0

これは非常に良いものです:https://github.com/novoda/ImageLoader。ソースを確認すると、これは自明ではないことがわかります。再作成しようとするのではなく、ライブラリを使用したい場合があります。あなたのお勧めのために –

関連する問題