【问题标题】:Android finish thread in Service and update UIAndroid 在 Service 中完成线程并更新 UI
【发布时间】:2011-11-30 08:32:37
【问题描述】:

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

任何建议如何做到这一点,这是我应该这样做的正确方式。

提前致谢!

【问题讨论】:

    标签: android multithreading service


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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        首先这取决于你使用什么样的网络客户端来下载数据,这个客户端决定传入数据的结束,然后你应该在你的Service对象类中调用stopSelf()方法而不是在@987654323中定义你的动作@方法的块

        【讨论】:

        • 这个想法是我想在线程完成时得到并在那之后停止我的服务。我认为线程自动完成后服务不会停止运行。我想这样做,但我不知道怎么做
        • 我不做,我想知道
        • 我还是不明白,你是如何实现你的服务的。如果 CPU 有大量工作,例如从网络下载,您应该在您的 Service 中创建单独的 Thread,这将使这项工作和 Thread 将一直存在,直到您的 Service 存在,因为您的 Service在调用 stopSelf() Service 对象后保留 Thread 上的引用,并且它的所有内部都将被 GC 销毁。您似乎认为Service 默认具有Thread 功能,但这是错误的。 Service 是唯一必要的,它可以保持线程的功能,使用Thread 对象。
        • 我知道线程和服务的区别。我有一个扩展Thread 的简单类,我还有另一个扩展Service 的类。所以我在service 课程中开始我的thread。我想知道当我的线程完成下载文件并触发服务停止时如何停止我的服务。这是我的问题,我想不通。
        • 官方文档中有很好的描述如何在Service中实现Thread,使用Looper类。让你的Thread 像那里一样。
        猜你喜欢
        • 2015-06-29
        • 1970-01-01
        • 2011-04-14
        • 2021-10-01
        • 1970-01-01
        • 2012-06-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多