【问题标题】:When will one need to create a separate process in a Application?什么时候需要在应用程序中创建一个单独的进程?
【发布时间】:2012-05-13 20:14:15
【问题描述】:

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

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

非常感谢任何其他信息。

谢谢, 货号

【问题讨论】:

标签: android


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    2.) 不应该使用线程。我们应该使用 AsyncTask 或加载器,而不是在 android 中。

    【讨论】:

    • 我了解并享受在我的应用程序中使用单独线程(以 Handler、AsyncTask 和工作线程的形式)的好处。但这并不意味着以上述任何方式创建一个新线程将创建一个新进程。您是否觉得使用单独的进程是对具有共同资源使用的线程进行分组?
    • 否,允许不同应用程序中的组件共享同一个进程有助于减少资源使用。创建新进程会增加资源利用率,但有时可能是必要的。例如,即使在不同进程中运行的应用程序崩溃,您也可能希望您的服务继续运行。
    • 我不会说不应该使用线程。 AsyncTask 使特定类型的任务更容易以编程方式实现,例如一些具有有限执行周期的任务,不应在主线程上完成,例如下载文件。
    • @Raghav,我理解您关于资源利用的观点。我觉得应该有许多其他用途,有单独的过程。谢谢,让话题开始。
    • AsyncTasks 对于 Android 中的许多线程任务来说不够重,对于需要比 AsyncTask 提供的接口更通用的接口的繁重任务,Android 中首选 Handlers 和 HandlerThreads。另外,@Rookie,您错误地将线程的一般主题与 Java 中提供的 Thread 类混为一谈......
    【解决方案3】:

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

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

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

    【讨论】:

    • 嗨 Wampie,我明白为什么我需要一个单独的线程来处理耗时的操作。但我不明白为什么Android的任何组件都需要一个单独的进程。除非另有说明,否则您的应用程序中的新线程将在现有应用程序进程中创建。我仍在寻找“为什么需要完全独立的流程”的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 1970-01-01
    • 1970-01-01
    • 2012-04-25
    • 2023-03-06
    相关资源
    最近更新 更多