Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/196.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android完成服务和更新UI中的线程_Android_Multithreading_Service - Fatal编程技术网

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

Android完成服务和更新UI中的线程,android,multithreading,service,Android,Multithreading,Service,我有一个关于线程和服务的小问题。我有一个例子,它是在运行在服务中的线程中通过internet下载数据。我想知道的是,我如何检测线程何时完成(所有数据都已下载),然后调用服务的ondestory(),它将在我必须执行的所有活动中更新UI 任何建议如何做到这一点,这是正确的方式,我应该这样做 提前谢谢 1)使用可以使用messenger在活动和服务之间进行通信。2) 如果您的数据存储在某个文件或数据库中,则只需发送一个广播接收器,该接收器将告诉活动该刷新了。3) 使用接口。但在这种情况下,您必须存储

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

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


提前谢谢

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

首先,它取决于您使用什么样的web客户端下载数据,该客户端确定传入数据的结束,然后您应该在
服务
对象类中调用
stopSelf()
方法,而不是在
onDestroy()
方法块中定义您的操作

  • 检测已完成的下载:如果您使用的是简单线程而不是,则需要创建一个回调,线程调用该回调来通知服务已完成的下载(例如
    onDownloadsFinished()
  • 与活动沟通:服务和活动之间有很多沟通方式,但我觉得最简单。 当绑定到服务时,活动可以直接在服务中注册回调
  • 修改UI:在尝试从回调中更改UI时,请确保使用,因为它将异步执行
  • 停止服务:只要活动绑定到服务,它就会运行。这不是一个问题,因为当执行中没有线程时,它几乎不会消耗任何资源。如果使用
    startService()
    开始后台下载,则只需在
    onDownloadsFinished()中调用
    stopSelf()
    。查看更多信息

  • 我的想法是,我想在线程完成时获取,然后停止服务。我认为在线程自动完成后,服务不会停止运行。我想这样做,但我不知道我怎么没有这样做,我想知道我仍然不明白,你们是如何实现你们的服务的。如果CPU有密集的工作,比如从web下载,您应该在
    服务
    中创建单独的
    线程
    ,这将使此工作正常,
    线程
    将一直存在,直到
    服务
    存在,因为您的
    服务
    在调用
    stopSelf()
    服务
    对象后在
    线程
    上保留引用,它的所有内部将被GC销毁。您似乎认为
    服务
    默认具有
    线程
    功能,但这是错误的<代码>服务
    是使用
    线程
    对象保存线程功能的唯一必要工具。我知道线程和服务之间的区别。我有一个扩展
    线程的简单类,还有一个扩展
    服务的类。所以我在
    服务
    类中开始我的
    线程
    。我想知道当我的线程完成下载文件并启动服务停止时,我如何停止我的服务。这是我无法解决的问题。在官方文档中,有关于如何使用
    Looper
    类在
    服务
    内部实现
    线程
    的详细描述。让你的
    线程
    jsut像那里一样。