【问题标题】:Execute long running operations on the service在服务上执行长时间运行的操作
【发布时间】:2013-02-07 20:36:10
【问题描述】:

我正在构建一个具有服务的应用程序。我知道所有应用程序组件都运行在同一个 UI 进程中,至少您在清单中指定了它。所以为了避免 ANR 的消息,我有三种方法。

  1. 在清单中指定服务以在单独的进程中运行,例如 android:process=":remote" 但我读过一些 StackOverflow 的帖子
    说这不是一个好主意,因为它消耗大量电池和cpu处理。 我真的很尊重,因为这些帖子来自值得信赖的人。

  2. 使用 IntentService。这可能是一个很好的出路。但我需要我的服务运行,即使 活动不可见。因为我需要该服务不断检查新的 Web 服务 来自其他用户的消息并通过通知通知。是否可以使用 一个意图服务?这是一个优雅的解决方案。

  3. 使用本地服务。只需从清单文件中删除 android:process=":remote" 属性。 但我得到一些 ...OnMainThreadException 错误。这意味着我需要创建一个特殊的 线程来执行那些长时间运行的操作或使用 AsyncTask,

也许还有其他方法可以做到这一点。请让我知道,如何在服务上执行长时间运行的操作。真的是当务之急。

谢谢。

【问题讨论】:

  • 如果我错了,请纠正我,但是,AFAIK 你从服务扩展的那些类通常在另一个线程中运行。牢记这一点。我现在有 2 个进程,1 是 UI 线程,2 是服务。将其他线程(网络连接)放入我的应用程序不会导致任何问题吗?这不是系统的开销吗?
  • 在 UI 上下文中执行的所有服务。因此系统没有开销将网络连接处理放到其他线程
  • @CommonsWare 你能帮帮我吗?

标签: android android-handler worker-thread


【解决方案1】:

Android 服务在 UI 线程中执行。因此,您应该使用 AsyncTask 或其他方式来处理网络请求的线程。

【讨论】:

  • 你真的明白了。但我会改变问题。因为不是我要找的。​​span>
【解决方案2】:

首先,让我们接受有两个部分:一个活动部分(网络)和一些在下一个活动部分之前的睡眠部分。我认为您可以将普通的本地 IntentService 用于活动部件。完成后的每个活动部分都应使用AlarmManager 重新安排下一个活动部分。这种方法可确保您的应用程序在睡眠部分不消耗资源。你是对的 - 一旦IntentService 获得要呈现给用户的结果,它就可以使用通知。

【讨论】:

  • 谢谢。 @Arhimed 你的意思是我可以使用普通的IntentServiceAlarmManager 在云(RESTws)上签出来自另一个远程用户的任何特定消息?一旦活动结束,intentService 不会被操作系统杀死吗?
  • IntentService 和 Activity 独立运行,因此如果 Activity 不可见,或者即使没有实例化,操作系统也不会终止服务。
  • 应该将AlarmManager 放置在 LocalService 内部或一个 Activity 中的哪个位置。有什么例子吗?
  • 作为一个起点 - stackoverflow.com/questions/8321443/… 这里有很多 AlarmManager 用法示例,请使用搜索或就此提出单独的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多