【问题标题】:What to use to perform a network operation in the background?使用什么在后台执行网络操作?
【发布时间】:2011-11-08 10:48:51
【问题描述】:

我正在从BroadcastReceiver 执行网络操作。此操作正在后台执行,发生这种情况时应用程序将不会运行。

哪个更好用? ServiceAsyncTask?

【问题讨论】:

  • Android: AsyncTask vs Service 的可能重复项
  • 我认为这不是重复的,使用 BroadcastReceiver 时有一些特定的注意事项。在这种特定情况下,应该使用服务。

标签: android service android-asynctask broadcastreceiver


【解决方案1】:

BroadcastReceiver 对象仅在调用 onReceive() 期间有效。一旦您的代码从此函数返回,系统就会认为该对象已完成且不再处于活动状态。所以在这里使用AsyncTaskThread 是有意义的。

同样来自documentation

特别是,您不能在 BroadcastReceiver 中显示对话框或绑定到服务。


如果此 BroadcastReceiver 是通过 <receiver> 标签启动的,则从该函数返回后,该对象不再存在。这意味着您不应该执行任何异步返回结果的操作——特别是在与服务交互时,您应该使用startService() 而不是bindService()。如果您希望与已经运行的服务进行交互,您可以使用peekService()

这意味着您可以在广播 rcvr 中startService(),通过意图传递网络操作所需的数据。该服务将执行网络操作。如果服务有粘性,您可以使用peekService()。但你永远不应该bindService() 到广播 rcvr。

【讨论】:

  • 更相关的报价是This means that for longer-running operations you will often use a Service in conjunction with a BroadcastReceiver to keep the containing process active for the entire time of your operation.
  • 嗯,谢谢,我错过了,你的意思是使用registerReceiver()
  • 关键是你应该在你的 BroadcastReceiver 中启动一个服务来做真正的工作并尽快从 Receiver 返回。您可以通过 Intent 将数据传递给服务。
【解决方案2】:

更好地使用服务。 AsyncTask主要是不阻塞UI。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-12
    相关资源
    最近更新 更多