2012-04-30 23 views
1

私のAndroidアプリケーションは、私たちのサーバーからファイルを要求するサービスに接続します。要求時に、ファイルの種類は不明ですが、サーバーの応答は、ファイル拡張子とファイルデータのバイト配列を含むHashmapになります。Androidのサーバーからバイト配列の画像を表示する

私のモバイルアプリは、このデータを受け取り、そしてそれはJPG、PNG、TXT、またはHTMLファイルである場合には、画面上のファイルを表示します。異なるファイルタイプの場合、ファイルが作成され、外部アプリケーションでファイルを開こうとするように求められます。

テキスト、HTML、および外部ファイルはすべて問題なく動作しています。私は、同じサーバー呼び出しを使用してい

E/AndroidRuntime(390): java.lang.OutOfMemoryError: bitmap size exceeds VM budget 

:イメージは、私は頻繁にこのエラーが出る私はロード最初のイメージのために正常に動作しているが、私は、サーバーに2つ目の呼び出しを行う場合は、リスト内の次の画像をロードするために新しい情報を古い情報に格納することを含む。ここ は、私が実際に画像データをロードしていますどこの私のコードです:

imageView.setImageBitmap(BitmapFactory.decodeByteArray(bytes, 0, bytes.length)); 

は、私のアプリケーションがクラッシュしないように、メモリの問題を処理する方法はありますか?私はすでに、画像をサーバー側から縮小して、サイズを小さくして管理しやすくしました(しかし、これは適切な修正の代わりにバンデードのようです)。現在、rawバイトとBitmapFactoryを使用してimageViewをロードしています。しかし別の方法があれば、私はいつも実際のpngまたはjpgで一時ファイルを作成することができます。

誰かがこれを処理するための最良の方法のいくつかのアドバイスを提供することはできますか?

答えて

3

画像は、数メガバイトの多くは、あなたのアプリが持っているRAMを使用します。 1Megapixel =アプリがメモリに保持する必要がある4Mバイトの生のイメージデータ(少なくともRGBA_8888モード)。複数の大きな画像は、どのデバイスでもクラッシュします。ファイルシステムそこからそれらを使用すると、彼らはあなたがそれらを必要以上に大きいしている場合sample size > 1でそれらをデコードする

  • ダウンロードイメージは/あなたはメモリを持っています。
  • すぐにrecyle()画像必要がない場合は、それらのネイティブバッファはGCでうまく動作しません。
+0

イメージをファイルシステムにロードした後にイメージを表示するにはどうすればよいですか?どの時点で画像をリサイクルするのですか?以前のバージョンのコードでビットマップデータにbitmap.recylce()を呼び出してみました。それはあなたが話していることなのでしょうか? – cain

+0

[BitmapFactory](http://developer.android.com/reference/android/graphics/BitmapFactory.html)はファイルから直接ロードできます。画像Aを読み込んだ後、サイズを変更してBになると、その時点でAをリサイクルすることができます。もうイメージが必要ないことをあなたが知っているときはいつでも。 – zapl

+0

私は、サーバが想定していたように画像のサイズを変更していないことが判明しました。私はまだメモリを殺していた5メガピクセルの画像を取得していました。私はあなたが示唆したヒントをまだ使用しています。ありがとう。 – cain

0

まずそれが画面に収まるようにビットマップをデコードし、スケーリングすることを確認してください。 新しいビットマップを設定する前に、imageViewからビットマップをリサイクルしてください。デコードされたビットマップへの参照を保持するか、このような古いビットマップにアクセスする必要があります。

Drawable d = imageView.getDrawable(); 
    if (d!=null && d instanceof BitmapDrawable){ 
     BitmapDrawable bd = (BitmapDrawable)d; 
     bd.getBitmap().recycle(); 
    } 
関連する問題