簡體   English   中英

將一個Android應用程序划分為兩個進程,以便可以將一個進程用於位圖操作,以避開OutOfMemoryErrors

[英]Divide an Android Application into two processes, so that one can be used for Bitmap operations in order to sidestep OutOfMemoryErrors

據我所知,我們可以為Android中應用程序中邏輯上分開的部分選擇分配不同的進程,據我所知,新進程將為其保留堆的新部分。

因此,可以說我們的應用程序利用了128 mb堆中的90-100 mb,我們需要使用50 mb位圖進行操作。

沒有時間重寫,重構和優化代碼,因此該應用程序使用的RAM少得多。

我們是否可以為用於處理那些重量級位圖操作的Activity分配不同的進程ID,所以我們可以避免OutOfMemoryError,如果可能的話,這樣做有何弊端?

我已經讀過這篇文章: 在android應用程序中使用多個進程的優缺點是什么,但是它不像我的問題那么具體。

這里:

http://developer.android.com/training/articles/memory.html#MultipleProcesses

有人提到這實際上可能會增加RAM占用空間,但是他們還沒有詳細說明。

我們是否可以為活動分配一個不同的進程ID,以處理那些重量級的位圖操作

您可以按照清單2中android:process屬性,按照第二個鏈接的說明 ,在單獨的流程中運行該活動。

所以我們避免了OutOfMemoryError

那不是保證。 實際上,考慮到以下引用的語句,這種可能性很小。

因此,可以說我們的應用利用了128 mb堆中的90-100 mb

您不能保證獲得超過16MB的內存。 即使使用android:largeHeap="true" ,也可能無法獲得比沒有該屬性時更多的堆空間。 不要以為任一過程必然具有的堆空間為50MB,除非你控制硬件。

如果可能的話,這樣做有何弊端?

除非您的第一個過程中沒有任何必要的位圖,否則它可能無濟於事。 因此,例如,如果您的第一個流程是使用Camera API拍攝相機照片,則無論如何,您都會在第一個流程中擁有整個位圖(或嘗試崩潰)。 OTOH,如果僅在第一個過程中下載了位圖,並且您以正確的方式(將結果流式傳輸到文件中)進行了處理,則可能會有助於解決問題。

但是,這確實意味着位圖處理活動的啟動速度會有些慢,因為它必須從磁盤上讀取位圖,或者在認為適當的情況下自行下載。

活動將需要的任何非IPC通信(例如,事件總線,單例緩存)將不存在。

進程在后台時會終止以釋放系統RAM。 而且,就您而言,這可能是任何一個過程。 您將需要能夠處理用戶離開您的應用程序(例如,HOME按鈕)並且其中一個或兩個進程已在此期間終止的情況。 同樣,當您的第二個進程處於前台時,您的第一個進程將被終止也不是沒有問題的-在這種情況下,我沒有檢查兩個進程屬於同一Android應用程序的進程重要性值。

並且,如前所述,您不能保證完全干凈的過程能夠將50MB的位圖加載到Dalvik / ART堆中。

有人提到這實際上可能會增加RAM占用空間,但是他們還沒有詳細說明。

RAM占用量=堆空間。 RAM占用空間是指與您的應用程序關聯的系統RAM總量。 當兩個進程都在運行時,與僅通過一個進程執行相同的工作相比,您將使用更多的系統RAM。 該位圖處理過程將在活動處於前台時進行,大約一會兒之后,在Android最終終止它以釋放系統RAM之前。

沒有時間重寫,重構和優化代碼,因此該應用程序使用的RAM少得多。

除非您控制硬件,否則您別無選擇。 您可以完全確定可以在RAM中處理50MB數據的唯一方法是通過NDK,因為本機分配( malloc()和friends)來自系統RAM,而不是Dalvik / ART堆,因此不計入該堆限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM