スレッドでは、(ソケットから)jpgイメージを取り出してバイト配列datas[]
に入れています。 それから私は、ビットマップを作成し、ImageViewの中でそれを表示するために、私のUIに送信:BitmapFactory.decodebyteArray()でメモリ使用量を改善する方法は?
スレッド側:ビットマップのオプションは以下のように定義されて
bundle.putParcelable("image", BitmapFactory.decodeByteArray(this.datas, 0, jpgSize,this.bitmapOption));
message.what = ThreadMessages.MSG_IMAGE_AVAILABLE;
message.setData(bundle);
this.uiHandler.sendMessage(message);
:
this.bitmapOption = new BitmapFactory.Options();
this.bitmapOption.inPurgeable = true;
ui側:
cameraView.setImageBitmap((Bitmap) bundle.getParcelable("image"));
私が知っている限り、アンドロイド2.xと4.0.xで電話で問題なく動作します。
01-30 14:12:02.311: I/ActivityManager(72): Process my.package (pid 1175) has died.
01-30 14:12:02.321: I/WindowManager(72): WIN DEATH: Window{41140848 my.package/my.package.DisplayOneCam paused=false}
01-30 14:12:02.331: I/WindowManager(72): WIN DEATH: Window{410f5020 my.package/my.package.main paused=false}
01-30 14:12:02.331: I/WindowManager(72): WIN DEATH: Window{41033308 my.package/my.package.DisplayCameras paused=false}
01-30 14:12:02.371: I/ActivityManager(72): Start proc my.package for activity my.package/.DisplayCameras: pid=1209 uid=10036 gids={3003, 1015}
01-30 14:12:02.371: I/ActivityManager(72): Low Memory: No more background processes.
01-30 14:12:02.391: I/WindowManager(72): WINDOW DIED Window{410f5020 my.package/my.package.main paused=false}
フェッチされたビットマップは、非常に高解像度の画像(800×600ではありません。しかし、私は、高いメモリ使用量にgalaxyTab 8.9(アンドロイド3.1)といくつかのテストをしたし、私の支援はシステムによって殺されます最大)が表示されますが、少なくとも10 fpsで表示されます(できる場合はそれ以上)。 inPurgeableオプションを使用すると、OOMクラッシュ(私はinPurgeableを使用する前に持っていました)を回避できますが、十分ではないようです。 inSampleSize(Strange out of memory issuesで説明したようなもの)を使用すると、画像のサイズを変更するための解決策ではないように見えます。画像ビューの全領域を占める画像が必要です。
私はバイト配列のjpgを受け取っていることを知っている私のメモリ使用量を向上させることができますし、私はそれをimageviewに表示する必要がありますか?
注:ビットマップのサイズを変更する必要はありません。受信したjpgのサイズはすでに十分です。
注2:トリガにSystem.gc()各decodeByteArrayは番目eproblemを解決するようだが、それは醜いだと性能はインテントに大量のデータを送信するためにParcelableを使用しdrasticly
私は画像を保存できません:私は毎秒少なくとも10枚の画像を表示しています。画像の書き込み、読み取り、削除は長い道のりです。私は最終的にアクティビティのバイト配列をデコードすることができますが、それだけです。 – grunk
バンドルを持続させ、反対側のプロセスを元に戻すことは、SDカードに書き込んだり再度読み込んだりするよりも遅くなる可能性があります。代わりに、アプリケーションに画像を保存しないのはなぜですか? –