【问题标题】:Pause task running on background thread to run a higher priority task暂停在后台线程上运行的任务以运行更高优先级的任务
【发布时间】:2014-10-29 21:24:48
【问题描述】:

我有一个服务在后台线程上做一些繁重的工作。它基本上是下载一个大的 zip (>5MB)、存储、解压缩、解析 XML 并将信息存储在 SQLite 数据库中。

当服务完成它的工作时,我有时必须运行一个快速的后台任务(比如登录用户)。但是,由于服务非常繁忙(通常是提取 zip 文件),我的短任务需要一段时间才能运行(并且用户必须等待)。

有没有一种方法可以完全暂停我的服务(它是后台 AsyncTask),以便我可以运行我的新的更高优先级的任务?

谢谢!

【问题讨论】:

  • 您在服务中使用简单线程还是 AsyncTask?请注意,在大多数 Android 操作系统版本中,all AsyncTask 运行在同一线程上,因此如果您在服务中使用 AsyncTask 进行长时间操作,它将阻止所有未来的 AsyncTask。这可能是也可能不是您的问题的根源(需要更多详细信息)。如果不是,另一个建议是降低你的服务线程,附带的好处是它甚至可以提高 UI 响应能力。
  • 失败。旨在在用户登录之前下载数据的应用。
  • @Kai 哇,我不知道。我认为每个新的 AsyncTask 都会产生一个新线程。那么如何降低服务中的线程呢?
  • @omegatai 我猜您确实在服务中使用了 AsyncTask,这肯定会阻止您的其他 AsyncTask 操作。您应该更改您的服务代码以使用线程并可选择设置其优先级 (Thread.setPriority(Thread.NORM_PRIORITY - 1))。如果这对您有用,请告诉我,我会将其更改为答案;)
  • @Kai:AsyncTask 的优先级是否会高于优先级为 Thread.NORM_PRIORITY - 1 的线程?顺便问一下,AsyncTask 的优先级是多少?

标签: android android-asynctask android-service android-handler


【解决方案1】:

据此:

stackoverflow.com/questions/18480206/asynctask-vs-thread-in-android

为什么不尝试简单的 java 线程而不是使用 AsyncTask。你也可以尝试给它更大的优先级,但在我看来,优先级并不是那么有效。

【讨论】:

  • 在 Android 中直接使用 Java 线程并不是一个好习惯,因为开发者需要手动处理回调,以及应该在后台执行的操作,导致大量样板代码。另一方面,使用 Asynctasks 还可以轻松创建后台线程,并覆盖其方法 onPrexecute doInBackground onPostExecute 等...有助于您拥有更简洁的代码并有效地管理回调。
猜你喜欢
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2016-02-23
  • 1970-01-01
  • 2013-03-26
  • 1970-01-01
相关资源
最近更新 更多