在Service中结束线程并更新UI的方法(Android)

4

我有一个关于线程和服务的小问题。我有一个例子,它在服务中运行的线程上下载互联网数据。我想知道的是如何检测我的线程何时完成(所有数据已下载),然后调用服务的onDestroy()更新所有活动中的UI,这是我必须做的。

有什么建议吗?这是我应该做的正确方式吗?

谢谢您的帮助!

3个回答

4
  1. 检测下载完成:如果您使用简单的线程而不是AsyncTask,则需要创建一个回调函数,用于通知服务完成下载(例如onDownloadsFinished())。
  2. 与Activity通信:有许多与服务和活动之间通信的方法,但我发现绑定服务最简单。当绑定服务时,活动可以在服务中直接注册回调函数。
  3. 修改UI:确保从回调函数内部尝试更改UI时使用runOnUiThread,因为它将异步执行。
  4. 停止服务:只要活动绑定到服务上,它就会运行。这不是问题,因为当没有任何线程在执行时,它几乎没有消耗任何资源。如果使用startService()开始后台下载,则只需在onDownloadsFinished()中调用stopSelf()。有关更多信息,请查看服务文档

0

1) 可以使用 Messenger 在活动和服务之间进行通信。2) 如果您的数据存储在某个文件或数据库中,则只需发送广播接收器,该接收器将告诉活动需要刷新。3) 使用接口。但在这种情况下,您将不得不存储该接口的对象,即服务也可以使用。


0
首先,这取决于您使用什么样的网络客户端来下载数据,该客户端确定传入数据的结束,之后您应该在您的Service对象类中调用stopSelf()方法,然后在onDestroy()方法块中定义您的操作。

我的想法是,我想知道线程何时完成,并在此之后停止我的服务。我不认为服务会在线程完成后自动停止运行。我想做到这一点,但我不知道如何实现。 - Android-Droid
我不会做这个,我想知道。 - Android-Droid
我仍然不太理解,你是如何实现你的服务的。如果有大量需要CPU工作的任务,比如从网络下载,你应该在你的服务中创建一个单独的“Thread”,它将完成这项工作并且在你的服务存在期间保持存活状态,因为你的服务在调用“stopSelf()”之后仍然会保留对该“Thread”对象的引用,如果没有这个引用,则GC将销毁整个服务对象及其内部。看起来你认为“Service”默认具有线程功能,但这是错误的。“Service”只是一个可以使用“Thread”对象承载线程功能的基础设施而已。 - teoREtik
我知道线程和服务之间的区别。我有一个简单的类,它扩展了Thread,还有另一个类,它扩展了Service。所以我在service类中启动了我的thread。我想知道当我的线程完成文件下载并触发服务停止时,如何停止我的服务。这是我的问题,我无法解决。 - Android-Droid
官方文档中有很好的描述,说明如何在Service内部实现Thread,使用Looper类。让你的Thread就像那样。 - teoREtik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接