2012-02-16 28 views
7

画面に読み込みたい画像のブロックがあります。すべての画像は、SD-CARDにダウンロードして保存したファイルです。 Android高速ビットマップ読み込み

は、これまでのところ私は、最初の活動が開始されたときに(私は約70の画像を持って、それはそれらすべてをロードするために私に約2.1秒かかります)、メインスレッド上でそれらをロードしている、それを行うには、2つの方法を発見しました。

もう1つの方法は、私が現在テストしていることです。別のスレッドにロードすると、ユーザーのアニメーションの読み込みを表示できます。今のところ、ThreadPoolExecutorの私の実装には4.3秒かかりました。私は10スレッドでそれをやった。

そして最後の方法、(それは私はまだテストしていないだけのことだが)スプライトシートで作業しています。

私のアプリケーションではたくさんの画面があり、各画面には独自の画像が設定されているため、アプリケーションキャッシュを使用できません。

あなたはどう思いますか、大量の画像をロードすると、あなたはそれが私を助けることができるどのような加速テクニクスを知っていますか最速の方法は何ですか?

+0

あなたはあなたのイメージのサイズを言及していないとあなたがそれらをロードするとき、あなたはそれらのサイズを小さくすることができた場合(例えば取ります5メガピクセルのJPEGで、320x240のサムネイルとして読み込みます)。これを許可すると、イメージのロードを大幅に高速化できます。 – BitBank

答えて

2

WeakReferenceを使用してイメージキャッシュを作成すると、メモリ不足が発生した場合にイメージがメモリから削除されます。こうすることで、イメージをメモリに保持し、メモリにないときにsdcardからロードするだけで済みます。したがって、現在のアクティビティでは常にビットマップの必須の参照が保持され、イメージキャッシュはビットマップの弱い参照を保持します。続き

は弱参照についてのいくつかの詳細は次のとおりです。

JavaDoc weakReference

StackOverflow post discussing using weak reference for cache

+1

-1:ガベージコレクタが非常に攻撃的であるため、この手法はすべてのデバイスでは使用できません。現在の推奨手法はLRUキャッシュです(http://developer.android.com/training参照)。 /displaying-bitmaps/cache-bitmap.html) – for3st

8
  1. メインスレッドにはロードしないでください。メインスレッドをブロックすると、ANR(アプリケーションが応答しない)エラーで2.1秒遅れて終了します。

  2. 別スレッドでロード。 10スレッドを作成せず、AsyncTaskを1つ作成し、すべての画像を次々にロードします(doInBackground)。

    AsyncTaskの読み込みは、メインスレッドの読み込みとほぼ同じ時間かかるはずです。あまりにも派手なアニメーションを置かないでください。メインスレッドはあまりにも多くのCPU時間を消費しません。

0

これを行う1つの方法は、一種のリスナー/オブザーバを実装することです。

あなたのUIスレッドから、イメージをロードする他のスレッドを起動します。イメージがロードされると、スレッドは、アクティビティクラスに実装されたコールバックメソッドを呼び出して、対応するイメージビューを更新します。

アンドロイド非同期タスクの代わりに、スレッド(プール/エグゼキュータ)を使用します。私はそれらをロードする前にすべての可能な画像パスを取得し、画像をロードするスレッドにディスパッチします。コールバックで私は画像を更新する場所を知っています。

また、あなたのケースでローダーの動作を確認することもできます。

0

明らかに、UIスレッドに2秒間の操作を残すべきではありません。

私はThreadPoolExecutorがGODDソリューションですが、あなたのプールに多くのスレッドを作成するために最適ではないと仮定します。バックグラウンドスレッドで十分です。これを変更するだけで、パフォーマンスが向上すると思います。

私はit is fragile to config changeので、Activityから直接AsyncTaskをお勧めしません。

スプライトでの作業はお勧めできません。 1つの画像のサイズを大きくすることは、メモリが限られている携帯電話では非常に危険です。特にスプライトでは、Bitmapの部分を取得しなければならないため、メモリ内に完全なビットマップを持っていなければなりません。

私はあなたの特定の質問に答えなかったので、問題は非常に似ているので、あなたはthrouh Lazy loading of images in a listviewに行くと思います。

関連する問題