1

Android アプリケーションがサービスに接続して、サーバーからファイルを要求します。要求時に、ファイルの種類は不明ですが、サーバーはファイル拡張子とファイル データのバイト配列を含むハッシュマップを返します。

私のモバイル アプリはこのデータを取得し、それが jpg、png、txt、または html ファイルである場合は、ファイルを画面に表示します。ファイル タイプが異なる場合は、ファイルが作成され、システムは外部アプリケーションでファイルを開くように求められます。

テキスト、html、および外部ファイルはすべて問題なく動作しています。画像は最初にロードした画像では正常に機能していますが、サーバーに 2 回目の呼び出しを行ってリスト内の次の画像をロードすると、次のエラーがよく発生します。

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

同じサーバー呼び出しを使用して、古い情報の上に新しい情報を保存しています。実際に画像データをロードしている場所のコードは次のとおりです。

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

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

誰かがこれを処理する最善の方法についてアドバイスを提供できますか?

4

2 に答える 2

3

画像は、アプリが持つ数メガバイトの RAM を大量に使用します。1 メガピクセル = 4 メガバイトの生の画像データ (少なくとも RGBA_8888 モード) は、アプリがメモリに保持する必要があります。複数の大きなイメージは、どのデバイスでもクラッシュします。

  • 画像をファイルシステムにダウンロードし、そこから使用し、必要以上に大きい場合/メモリがある場合は、サンプルサイズ> 1でデコードします。
  • recyle()画像が必要ない場合は、すぐに画像を取得してください。それらのネイティブ バッファは、GC ではうまく機能しません。
于 2012-04-30T14:50:37.770 に答える
0

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

    Drawable d = imageView.getDrawable();
    if (d!=null && d instanceof BitmapDrawable){
        BitmapDrawable bd = (BitmapDrawable)d;
        bd.getBitmap().recycle();
    }
于 2012-04-30T15:35:12.887 に答える