有人能告诉我真正的区别吗?
有人能告诉我真正的区别吗?
Activity
在后台运行,那么当你尝试用结果等更新UI时可能会出现问题。Activity
比Service
更容易被杀掉。AsyncTask
或Service
时可能出现的问题的最后一点是决定使用哪种方式的关键因素。我认为第一个限制仍然可以解决-不要直接从AsyncTask
更新UI,而是像在Service
中一样做(广播一个意图,显示通知,或将数据插入到ContentProvider
中以供稍后由Activity
获取)。然而,第二点-关于Activity
更容易被杀死-那是最相关的点。 - curioustechizen当需要长时间在后台运行某些任务时,请使用Service。它不绑定到任何活动。典型的例子是音乐播放器。
AsyncTask 在当前活动中有一些必须在后台完成的任务时非常好用,例如下载、搜索文件中的文本等。
个人而言,我仅使用Handlers将更改发布到UI线程。例如,在后台线程中进行一些计算,并通过处理程序发布结果。
最重要的是:在大多数情况下,AsyncTask 就是您需要的。
例如:在按钮单击时下载某些内容,仍停留在同一活动中并显示进度条/滑块以更新已下载的百分比。如果活动进入后台,则可能会发生冲突。
例如:当从Android Market下载的任何应用程序在状态栏中显示通知并且UI返回到先前的页面并允许您执行其他操作时。
AsyncTask
不一定需要更新 UI。因此,您提到的 Service 的使用情况也可以使用 AsyncTask 实现:只需不要在 onProgressUpdate()
或 onPostExecute()
方法中更新 UI。 - curioustechizen服务是一个应用程序组件,可以在后台执行长时间运行的操作并不提供用户界面。另一个应用程序组件可以启动服务,即使用户切换到另一个应用程序,它也将继续在后台运行。此外,组件可以绑定到服务以进行交互。
何时使用?
没有用户界面的任务,但不应该太长。对于长时间的任务,请在服务内使用线程。 一般情况下的长任务。
触发:调用onStartService()方法
触发自:任何线程
运行于:其托管进程的主线程。服务不会创建自己的线程,也不会在单独的进程中运行(除非您另有指定)
限制/缺点:可能会阻塞主线程
AsyncTask允许正确且轻松地使用UI线程。该类允许在后台执行操作并在UI线程上发布结果,而无需操纵线程和/或处理程序。异步任务由在后台线程上运行的计算定义,并在UI线程上发布其结果。
何时使用?
需要与主线程通信的小型任务 对于并行任务,请使用多个实例或Executor 可能需要花费数毫秒以上时间的磁盘绑定任务
触发器:调用execute()方法
触发源:主线程
运行于:工作线程。但是,在发布进度期间可能会调用主线程方法。
限制/缺点:
参考链接