2011-10-06 133 views
2

假設您有一個在Android設備上生成本地HTTP服務器的應用程序。Android:獨立線程與獨立應用程序

在單獨的應用程序中運行它而不是產生單獨的線程會有什麼好處嗎?

由於堆大小限制在應用程序,我假設運行單獨的應用程序時有更多的內存呼吸空間。

除此之外,根據性能是否還有其他好處(或缺點),如更大的CPU時間塊?

+0

線程在Android是http://developer.android.com/reference/java/lang/Thread.html,但你是什麼應用* *是什麼意思? –

+0

單獨的.apk進程。 –

+0

「生成本地HTTP服務器的應用程序」。除了產生服務器之外,應用程序還有什麼功能?應用程序的其餘部分如何與服務器通信? –

回答

1

的一個大缺點我看到運行在不同的線程應用程序組件時發生的這兩個部分將在不同的DVM的。這可以使共享首選項更改,監聽器,觀察者等等不能像預期的那樣工作,您還必須確保所有數據庫訪問都是同步的。

,如果你正確地同步,不需要的喜好,你可以使用捆綁或AIDL從2個應用程序來回溝通解決這個問題。最好的選擇是用於雙向連續通信的AIDL,但要注意AIDL可能很昂貴。通信的另一種選擇是套接字...但這與所提供的SDK不一致。我在做這件事時學到的一個技巧是創建一個API jar文件,以包含將處理所有通信的應用程序(通過intent或AIDL - blackbox方法)。

我個人認爲都差不多應該留在同一個DVM和應用程序組件,除非他們可以運行的獨立,那麼你必須成爲法官。

你有沒有關於如何運行HTTP服務器上的正在進行的前臺服務?這樣可以解開你的設計,讓事情變得簡單輕鬆。

0

SDK中有一個remote service示例。

如果你有兩個應用程序,你絕對需要遠程服務。就像我的經驗一樣,這只是在應用程序之間進行溝通的方式。

從我的角度來看,這是不好與被手機所使用的概念「服務器」。但也許你有你的理由...

+3

「如果您使用兩個應用程序,則絕對需要遠程服務。」 - 這是不正確的。 「這是在應用程序之間進行通信的唯一途徑」 - 這是不正確的。 – CommonsWare

+0

@CommonsWare,謝謝,我明白......這是錯誤的。 – 2012-03-21 23:39:32

1

使用單獨的進程可以顯着增加應用程序的內存佔用量。您不僅可以獲得多個Dalvik核心開銷(每個進程2-3MB),還可以共享應用程序使用的任何RAM(例如代碼中的靜態符號等)。

另外,你有更多的CPU開銷,因爲你現在需要爲跨越邊界您的應用程序的不同部分之間的任何交互做IPC。而且你在實現中有更多的複雜性,因爲實際上你需要實現IPC並找出如何正確管理在孤立地址空間中運行的應用程序的這些不同部分。

對於絕大多數情況,我認爲使用多個進程並不好。

0

在大多數情況下,如果你通過服務,但並不總是運行服務器在一個單獨的過程中,你會得到你的性能的提高應用程序。 注意:服務可以在其自己的獨立進程中運行,但爲此您必須在xml中提供android:服務標記。在這種類型的設計,我想你已經知道

的一個大缺陷是,在Android的每個進程都在自己的虛擬machine.So運行,如果你產生新的進程會得到它自己的VM。現在您自己考慮哪個更好。運行整個應用程序的一個虛擬機或運行其中的兩個虛擬機。 (在大多數情況下,我聽說至少在android 1虛擬機綽綽有餘,足以處理您需要的一切)

除此之外,另一個缺陷是,當你從你的應用程序的主進程分開的過程,你是在一個單獨的進程中運行服務器服務的話,也可以不關機,即使你的應用程序遇到一個異常或錯誤作爲其從主流程的過程,並且不依賴於生命週期的你的應用程序anymore.So它可以導致一些意外的行爲,並可能導致您的應用程序發生故障。

如果您可以冒險,那麼請與線程一起使用(我會建議服務中使用Asynctask)以滿足您所尋求的目的,因爲它將爲您提供幾乎相同的功能,同時保證安全應用程序範圍/生命週期。

希望這有助於。

0

首先,你不需要單獨申請,你定義自己的應用程序另一個進程。在大多數情況下,做這樣的事情會提高你的表現,因爲你的過程實際上在分離的物理過程中運行的可能性更大。 Android操作系統如何不支持這一點,而不是Android 4.03中的事件。

所以,你將從此得到的唯一好處是記憶,巫婆在我看來不應該是用於打開其它程序的理由。