Android完成服务中的线程并更新UI

时间:2011-11-30 08:32:38

标签: android multithreading service

我对线程和服务有一点疑问。我有一个例子,它是在服务中运行的线程中通过互联网下载数据。我想知道的是我如何检测我的线程何时完成(所有数据都已下载),然后调用服务的onDestroy(),这将在我必须执行的所有活动中更新UI。

任何建议如何做到这一点,并且是我应该采取的正确方法。

提前致谢!

3 个答案:

答案 0 :(得分:4)

  1. 检测已完成的下载:如果您使用的是简单的线程,而不是AsyncTask,则需要创建一个回调,线程调用该回调以通知服务已完成的下载(例如。onDownloadsFinished())。
  2. 与活动进行通信:有很多方法可以在服务和活动之间进行通信,但我发现binding to a service最简单。 绑定到服务时,Activity可以直接在服务中注册回调。
  3. 修改用户界面:确保在尝试从回调中更改用户界面时使用runOnUiThread,因为它将执行异步。
  4. 停止服务:只要活动绑定到服务,它就会运行。这不是问题,因为当执行某些东西时没有线程它几乎不消耗任何资源。如果您使用stopSelf()开始后台下载,则只需在onDownloadsFinished()内拨打startService()即可。请查看service documentation以获取更多信息。

答案 1 :(得分:0)

1)使用可以使用信使,以便在活动和服务之间进行通信。 2)如果您的数据存储在某个文件或数据库中,那么只需发送一个广播接收器,它将告诉活动它的刷新时间。 3)使用界面。但在这种情况下,您将必须存储甚至服务可以使用的该接口的对象。

答案 2 :(得分:0)

首先,这取决于您使用何种类型的Web客户端下载数据,此客户端确定传入数据的结束,之后您应该在stopSelf()对象类中调用Service方法,而不是定义onDestroy()方法块中的操作