服务、异步任务和线程之间有什么区别。如果我没记错的话,他们都习惯于在后台做一些事情。那么,如何决定使用哪个以及何时使用?
6 回答
可能您已经阅读了有关它们的文档描述,我不会重复它们,而是会尝试用我自己的话给出答案,希望它们对您有所帮助。
服务就像一个活动,但没有用户界面。例如,如果您想获取天气,可能不会为其创建空白活动,为此您将使用服务。
一个线程就是一个线程,可能你已经从其他部分知道了。您需要知道您不能从线程更新 UI。您需要为此使用处理程序,但请进一步阅读。
AsyncTask 是一个智能线程,建议使用。智能,因为它可以帮助它的方法,并且在 UI 线程上运行三个方法,这对更新 UI 组件很有好处。
我经常使用服务、异步任务。线程更少,或者根本没有,因为我几乎可以用 AsyncTask 做所有事情。
这是您问题的最简单答案
线
是与主线程“并行”运行的执行单元,这一点很重要,除了主线程之外,您不能从这里的任何线程更新 UI 组件。
异步任务
是一个特殊的线程,它为您提供更新 UI 的辅助方法,因此基本上您可以更新 UI,即使 AsyncTask 将在后台线程上运行。不需要显式地完成进程间通信处理。
服务
解决上述问题,因为它与调用它的活动分开,因此即使活动被破坏,它也可以继续运行,它在主线程中运行(注意 ANR)使用后台服务(扩展 IntentService 它会自动创建工作线程给你)。服务就像一个没有 UI 的活动,适合长时间的任务
我希望几天前有人告诉我的更多信息:
- 您可以在活动和服务之间共享全局变量,例如线程。
- 只要 Activity 或 Service 仍然存在,您的应用程序及其所有全局变量就不会被清除。
- 如果您的应用程序中有一个服务实例并且操作系统需要资源,它首先会杀死您的活动,但只要有服务,操作系统就不会清除您的应用程序及其全局变量。
我的用例是这样的:我在全局空间中有一个连接到服务器的线程和一个显示结果的 Activity。当用户按下主页按钮时,Activity 进入后台并启动新的服务。然后,该服务从线程中读取结果,并在需要时在通知区域中显示信息。我不担心操作系统会破坏我的活动,因为我知道只要服务正在运行,它就会破坏线程。
简而言之,Service for time consuming tasks
,AsyncTask for short-lived tasks
,Thread是一个standard java construction
for 线程。
从开发者的角度来看:
线程:用于执行集合到与主线程并行的代码。但是您无法处理线程内的 UI。为此,您需要使用Handler
. Hadler
绑定线程使其成为 UI 线程Runnable
。Looper
ASyncTask:用于处理那些不能在主线程上工作的任务。例如,一个 HTTP 请求是一项非常繁重的工作,无法在主线程上处理,所以你处理 HTTP 请求在ASyncTask
它与你的主线程并行工作在后台异步。它有一些在其相应事件上调用的回调方法。
服务:在同一Application
进程下的后台工作。当您必须进行一些没有与之关联的 UI 的处理时,就会实现它。
服务类似于活动耗时的任务,但异步任务允许我们执行长/后台操作并在 UI 线程上显示其结果,而无需操作线程。