我对 Android 中 Asynctask
、Thread
、Service
、Loader
之间的区别感到有些困惑。
我知道它是如何工作的。但我仍然不明白我应该使用什么以及何时使用。
我在 Android 上工作了 3 年,并且通常仍将 AsyncTask
用于所有后台任务(有时是线程)。但是很多人说“Asynctask 已经过时”,不推荐使用。他们还建议使用 robospice 或 Volley。
那么,AsyncTask
真的那么糟糕,我应该使用框架来完成网络任务吗?我应该将什么用于后台(不是网络)任务?
最佳答案
线程:与 Java 线程相同,使用它来执行繁重的操作,但您必须自己管理它,它还会导致同步问题,并且在您在 UI 线程上运行之前无法从中更新 UI .
AsyncTask:Android 中用于执行后台任务的出色线程库。它由 android 操作系统本身管理,您可以从中更新 UI。它可以并行或串行运行,具体取决于 android 的版本。有时在方向变化的情况下使用它可能会很麻烦,现在为了进行网络调用,您可以使用比 AsyncTask
更好的 volley。 AsyncTasks 不关心他们的父 Activity 是否正在运行,有时取消它可能非常乏味。因此,如果您使用 AsyncTask 来更好地调用其他 API,我建议您使用 RETROFIT或 VOLLEY如果您在两者之间选择 RETROFIT,我建议您查看 PICASSO另一个来自 square 的很棒的图片加载库。
服务:要执行长期后台任务,您应该使用服务。如果需要,您可以将服务绑定(bind)到您的 Activity 。您可以定义它们在同一线程或不同线程中运行,并且您需要在 list 中声明它,或者您可以使用 IntentService
- 在自己的线程中运行的服务变体,但在使用之前要小心它,不要将它用于长时间运行的任务。这是一个单一的时间运算符。如果您要使用服务,请评估哪种情况更适合您的要求,使用普通服务或 IntentService
Loaders:这在很多方面与AsyncTask
相同,建议在 fragment 中使用loaders,它解决了asynctasks的方向问题。
如果你已经迁移到 kotlin,我建议你看看 Coroutines .这些非常轻量级并且对于线程非常有效,并为您提供了对生命周期的大量控制。 我希望这会有所帮助。
关于android - Asynctask vs 线程 vs 服务 vs 加载器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24651489/