7

我正在阅读 Android 开发人员博客Process and Threads中的一篇文章,其中讨论了为应用程序的特定组件创建新进程。但我不明白什么时候在我的应用程序中创建一个新进程成为绝对需要。您能否帮助我理解以下我在这方面的疑问。

  1. 作为一名开发人员,我什么时候应该觉得我需要为 Android 组件建立一个单独的进程?
  2. 引入新流程是否会对应用程序的整体性能产生任何副作用?

非常感谢任何其他信息。

谢谢, SKU

4

3 回答 3

4

如果您的应用程序的某些组件不一定需要同时运行才能对用户有用,并且后台任务对于应用程序“正确性”(现在或将来)至关重要,那么拥有一个单独的进程可能很有用。典型的例子是一个应用程序,它有一个服务,该服务保存或上传一些对您的应用程序至关重要的数据(关键意味着取回数据的唯一方法是让用户重新输入它!)。服务可能负责上传或保存数据等操作,而活动只是用户的界面。所以开发人员应该将这两个组件解耦,以防止我的下一点可能出现的问题..

Android 被设计为在资源(尤其是内存)受限的环境中运行,因此被认为不重要的进程会定期被“低内存杀手”(LMK)杀死以为重要的进程打开内存(如果你谷歌这个,你会得到很多有关该主题的信息)。可以理解的是,前台进程之类的东西由于当前正在使用而被赋予更高的优先级,但有时它们也会因消耗过多内存等原因而被终止。现在,假设您需要在用户在应用程序中执行某些操作后将一些数据保存到数据库中,并且您使用服务来执行此操作以确保即使用户离开应用程序也能完成。除非您在自己的进程中创建服务,否则包含活动和服务的进程可能会被终止,因为该进程属于非前台活动。然而,并不总是需要将服务放在自己的进程中,通常只需给服务自己的线程就足够了;这是非常特定于应用程序的。我只会将服务放在它自己的进程中,如果它需要超过几秒钟(足够长的时间让用户离开我的应用程序并让 LMK 介入)在后台执行一些任务并且与该任务相关我的应用程序的“正确性”(IE 保存数据以备后用)。对于像缓存这样的东西,坚持使用线程,因为如果进程被过早终止,您可以稍后重新创建该数据。然而,并不总是需要将服务放在自己的进程中,通常只需给服务自己的线程就足够了;这是非常特定于应用程序的。我只会将服务放在它自己的进程中,如果它需要超过几秒钟(足够长的时间让用户离开我的应用程序并让 LMK 介入)在后台执行一些任务并且与该任务相关我的应用程序的“正确性”(IE 保存数据以备后用)。对于像缓存这样的东西,坚持使用线程,因为如果进程被过早终止,您可以稍后重新创建该数据。然而,并不总是需要将服务放在自己的进程中,通常只需给服务自己的线程就足够了;这是非常特定于应用程序的。我只会将服务放在它自己的进程中,如果它需要超过几秒钟(足够长的时间让用户离开我的应用程序并让 LMK 介入)在后台执行一些任务并且与该任务相关我的应用程序的“正确性”(IE 保存数据以备后用)。对于像缓存这样的东西,坚持使用线程,因为如果进程被过早终止,您可以稍后重新创建该数据。我只会将服务放在它自己的进程中,如果它需要超过几秒钟(足够长的时间让用户离开我的应用程序并让 LMK 介入)在后台执行一些任务并且与该任务相关我的应用程序的“正确性”(IE 保存数据以备后用)。对于像缓存这样的东西,坚持使用线程,因为如果进程被过早终止,您可以稍后重新创建该数据。我只会将服务放在它自己的进程中,如果它需要超过几秒钟(足够长的时间让用户离开我的应用程序并让 LMK 介入)在后台执行一些任务并且与该任务相关我的应用程序的“正确性”(IE 保存数据以备后用)。对于像缓存这样的东西,坚持使用线程,因为如果进程被过早终止,您可以稍后重新创建该数据。

有一个单独的进程的另一个原因是,如果您正在运行一个全局服务(一个可以由您自己的应用程序以外的应用程序使用的服务),您可能通过一个 Activity 提供一个接口来进行配置。

至于性能问题,这样的事情肯定会对性能产生影响。进程间通信并不便宜,所以你真的应该只使用一个单独的进程,如果你适合一个特定的用例,就像上面提到的那样。此外,维护进程需要一定数量的内存开销,因此这是另一个性能损失。

于 2016-02-10T18:56:27.437 回答
0

1.)当您不希望您的应用程序运行缓慢时,您需要在单独的进程或线程上做一些事情。通过引入线程,您会强制您的应用程序不在 UI 线程上运行。从而使您的应用程序响应其他事件。例如:当您必须从 Web 服务获取一些数据时,您可以使用线程,以便它在后台发生并且不会影响您的应用程序。

2.)不应该使用线程..我们应该在android中使用AsyncTask或loaders。

于 2012-05-13T20:31:30.233 回答
0

1.) 在 android 4.0(可能还有 3.0,但不确定)中,设备不允许您在主线程中使用 HTTP 代理,因为这会减慢 UI 速度。这是线程派上用场的时候。

同样使用需要大量 cpu 的函数,如果这些函数在 UI 线程中运行,UI 将滞后并且在函数完成之前不会响应。

2.) 如 1 所述,它实际上会提高应用程序的视觉性能;)

于 2012-05-13T20:37:43.007 回答