在一個線程中,我從一個套接字中獲取一個jpg圖像並將它放入一個字節數組datas[]
。 然後我做一個位圖,並將其發送到我的UI在imageview的進行顯示:如何通過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;
用戶界面:
cameraView.setImageBitmap((Bitmap) bundle.getParcelable("image"));
據我所知,它在Android 2.x和4.0.x手機上正常工作。但我已經做了一些試驗用的GalaxyTab 8.9(安卓3.1)和我的應用工作由系統殺死由於內存佔用率過高:
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最大),但它至少以10 fps顯示(如果可能的話)。 使用inPurgeable選項可以避免OOM崩潰(我在使用inPurgeable之前就已經使用過),但似乎還不夠。 使用inSampleSize(如Strange out of memory issues中所述)似乎不是一個解決方案,因爲它調整了圖像的大小,並且我需要一個採用imageview的整個空間的圖像。
如何知道我在一個字節數組中接收到一個jpg並且我需要在imageview中顯示它?
注意:我不需要/想要調整位圖大小,收到的jpg已經大小合適。
注2:每個decodeByteArray後觸發的System.gc()似乎解決日eproblem,但它的醜陋和性能drasticly
我無法存儲圖像:我每秒至少顯示10張圖像。寫作,閱讀和刪除圖片將是一個漫長的過程。我最終可以解碼活動中的字節數組,但僅此而已。 – grunk 2012-01-30 15:59:12
堅持捆綁並在另一端反轉進程可能比寫入SD卡並再次讀回更慢。如果你不想這麼做,爲什麼不把圖像存儲在應用程序中呢? – 2012-01-31 11:40:57