假设您有一个应用程序在Android设备上生成本地HTTP服务器。
在单独的应用程序中运行它而不是产生一个单独的线程会有什么好处吗?
由于堆大小是每应用程序的上限,我假设在运行单独的应用程序时有更多的内存喘息空间。
除此之外,在性能方面还有其他好处(或缺点),例如更大的CPU时间?
答案 0 :(得分:1)
我看到在不同线程中运行应用程序组件时发生的一个很大的缺点是这两个部分将在不同的DVM中。这可以使共享首选项更改,监听器,观察者等不能按预期工作,您还必须确保所有数据库访问都是同步的。
如果您正确同步并且不需要首选项,则可以使用捆绑包或AIDL来反复来自2个应用程序的来回通信。最好的选择是AIDL用于双向连续通信,但要注意AIDL可能很昂贵。通信的另一个选择是套接字......但这违背了提供的SDK。我这样做的一个技巧是创建一个API jar文件,以包含在将处理所有通信的应用程序中(通过意图或AIDL - 黑盒方法)。
就我个人而言,我认为类似的应用程序组件应该保留在相同的DVM和应用程序中,除非它们可以独立运行,然后你必须做出判断。
您是否正如在正在进行的前台服务中那样运行HTTP服务器?这样可以解开您的设计,使事情变得简单轻松。
答案 1 :(得分:1)
使用单独的进程可以显着增加应用程序的内存占用量。您不仅可以获得多个核心Dalvik开销(每个进程数2-3MB),而且您的应用程序使用的RAM都不能共享(例如代码中的静态符号等)。
另外,您有更多的CPU开销,因为您现在需要为跨越边界的应用程序的不同部分之间的任何交互执行IPC。而且您在实现上有更多的复杂性,因为您实际上需要实现该IPC并找出如何正确管理在隔离地址空间中运行的应用程序的这些不同部分。
对于绝大多数情况,我认为使用多个流程并不好。
答案 2 :(得分:0)
SDK中有一个remote service示例。
如果您使用两个应用程序,则绝对需要远程服务。根据我的经验,这只是在应用程序之间进行通信的唯一方式。
从我的观点来看,在手机上使用“服务器”概念并不好。但也许你有理由......
答案 3 :(得分:0)
在大多数情况下,如果您通过服务在一个单独的流程中运行服务器,那么您的性能将得到提升,但并非总是如此。 注意:服务可以在一个单独的进程中运行,但为此你必须在xml中提供android:service标记。
我认为你已经知道的这种设计中的一个重大缺陷是,在android中,每个进程都在自己的虚拟机中运行。所以,如果你产生一个新进程,它将获得自己的VM。现在你自己考虑哪个更好。为整个应用程序运行一个VM或运行其中两个。 (在大多数情况下,我听说至少在android 1 VM中绰绰有余地处理你需要的一切)
除此之外,另一个缺点是,当您将流程与应用程序的主流程分开时,您将在单独的流程中运行服务器服务,然后即使您的应用程序遇到异常或错误,它也可能无法关闭与主流程的流程不同,并且与应用程序的生命周期无关。因此,它可能会导致一些意外行为并导致您的应用程序出现故障。
如果你可以承担风险而不是使用它,否则请使用线程(我建议在服务中使用Asynctask)以达到您所寻求的目的,因为它将为您提供几乎相同的功能,同时在应用程序中安全范围/生命周期。
希望这会有所帮助。
答案 4 :(得分:0)
首先,您不需要单独的应用程序,为您自己的应用程序定义另一个进程。在大多数情况下,执行此类操作会提高您的性能,因为您的流程实际上在分离的物理流程上运行的可能性更大。然而,Android操作系统不支持这一点,而不是Android 4.03中的事件。
所以你从中获得的唯一好处就是记忆,在我看来,女巫不应该成为开启另一个过程的理由。