【问题标题】:Avoid ANR in android bound service避免在 android 绑定服务中出现 ANR
【发布时间】:2013-10-30 09:20:48
【问题描述】:

我有绑定服务。例如,服务有一个方法 calculate(),它会进行一些非常密集的计算,如果活动关闭,应该继续执行(这就是为什么选择服务,而不是异步任务)。这个服务返回一些结果值,当它再次打开时应该显示在活动上。 问题如下,如果绑定服务必须返回一些值,如何优雅地避免 ANR 错误?

【问题讨论】:

标签: android multithreading service android-asynctask android-anr-dialog


【解决方案1】:

如果您使用Service,这并不意味着您不需要线程(或 AsyncTask)。你确实需要。

Service 引用的摘录:

请注意,服务与其他应用程序对象一样,在其托管进程的主线程中运行。这意味着,如果您的服务要执行任何 CPU 密集型(例如 MP3 播放)或阻塞(例如网络)操作,它应该生成自己的线程来完成这项工作。

所以,我只是将 AsyncTask 放在 Service 中以避免 ANR。

更新:

AsyncTask 允许正确且轻松地使用 UI 线程。此类允许在 UI 线程上执行后台操作并发布结果,而无需操作线程和/或处理程序。

您可以使用以下方法更新主线程:

onProgressUpdate(Progress...),在调用 publishProgress(Progress...) 后在 UI 线程上调用。执行的时间是不确定的。此方法用于在后台计算仍在执行时在用户界面中显示任何形式的进度。例如,它可用于动画进度条或在文本字段中显示日志。

【讨论】:

  • 谢谢。您对在服务中使用 Callable 和 Future 有何看法?它将允许返回值并在单独的线程中执行。
  • 我从来没有使用过这两个,但我认为在这种情况下你需要的只是 AsyncTask 类。有关更多信息,请参阅我的更新答案。
【解决方案2】:

在您的服务上也使用 Thread 或 asynctask for calculate()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    相关资源
    最近更新 更多