2012-01-30 84 views
0

在一個線程中,我從一個套接字中獲取一個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

回答

2

放緩利用Parcelable發送大量的數據意圖是一個壞主意,並有可能導致表現不佳。將圖像存儲到持久性存儲器並將URI傳遞到存儲的圖像而不是圖像數據本身會更好。

有一個在how do you pass images (bitmaps) between android activities using bundles?

+0

我無法存儲圖像:我每秒至少顯示10張圖像。寫作,閱讀和刪除圖片將是一個漫長的過程。我最終可以解碼活動中的字節數組,但僅此而已。 – grunk 2012-01-30 15:59:12

+0

堅持捆綁並在另一端反轉進程可能比寫入SD卡並再次讀回更慢。如果你不想這麼做,爲什麼不把圖像存儲在應用程序中呢? – 2012-01-31 11:40:57

0

一些這方面的詳細信息沒有必要使用捆綁,如果你只是通過你的申請過程中的信息。只需在Message.obj中傳遞您的位圖。