我对Android中的Asynctask、Thread、Service和Loader之间的区别有点困惑。
我知道它是怎么工作的。但我仍然不明白我应该在什么时候使用。
我使用Android已经3年了,通常仍然使用AsyncTask
来完成所有后台任务(有时还有Thread)。但是很多人说“AsyncTask已经过时了”,不建议使用它们。他们还建议使用robospice或Volley。
那么,AsyncTask真的那么糟糕吗?我应该使用这个框架来完成网络任务吗?我应该用什么做背景任务(而不是网络任务)?
你使用什么抽象并不重要,它可以归结为一个线程。因此,Android的每个异步/并行类都在后台使用线程执行器,并且具有与线程完全相同的潜在问题,例如锁定。
然后之间的区别在于它的“用法”。AsyncTask
例如,定义了一个方便的完成回调-onPostExecute()
。CountDownTimer
允许您控制时间等。
当然,您可以使用普通的线程,但在这种情况下,您必须投入更多的时间自己发现可能的问题。
因此,Android为你提供了两个合适的工具来完成合适的工作。
AYSNCTASK并不是“过时”的,因为它们是不完整的。除此之外,异步任务不必担心其父活动当前是否正在运行。出于同样的原因,您需要检查上下文是否为null。此外,除非您使用自己的线程池执行器,否则这些任务将串行执行。
凌空截击试图填补这些空白,主要涉及与主线程的同步和线程池。如果你想做需要平均网络请求的事情,它的表现是最佳的;像一些元数据列表和图像(如youtube应用程序请求和facebook应用程序请求帖子)。
通常情况下,凌空抽射的优势如下
谷歌I/O上提到的流媒体请求/视频,凌空截击的表现很糟糕。
PS:如果你有时间,请看https://www.youtube.com/watch?v=yhv8l9F44qo
如果您希望进入其他具有相同基准的库,请进一步阅读。Android网络库的比较:OkHTTP、Reformation和Volley
线程:与Java线程一样,使用它来执行繁重的操作,但您必须自己管理它,它也可能导致同步问题,并且您无法从中更新UI,直到您在UI线程上运行它。
AsyncTask:Android中用于执行后台任务的强大线程库。它由android操作系统本身管理,您可以从中更新UI。它是并行运行还是串行运行取决于android的版本。有时在方向改变的情况下使用它可能会很麻烦,现在在进行网络调用时,可以使用凌空,这比异步任务要好。AsyncTasks并不关心它们的父活动是否正在运行,有时取消它可能会非常繁琐。因此,如果您使用AsyncTask使RESTAPI调用更好,我建议您使用Refught或VOLLEY,如果您在两者之间选择Refught,我建议您看看PICASSO另一个来自square的很棒的库,用于图像加载。
服务:为了完成长期的后台任务,你应该使用服务。如果需要,您可以将服务绑定到您的活动。您可以定义它们在同一个线程或不同的线程中运行,您需要在清单中声明,或者您可以使用IntentService,这是一种在自己的线程中运行的服务变体,但在使用它之前要小心,不要将其用于长时间运行的任务。这是一个单时间运算符。如果您打算使用服务,请评估哪一个更适合您的需求,即正常服务还是意向服务
加载器:这在许多方面与AsyncTask
相同,建议将加载器与片段一起使用,它解决了异步任务的方向问题。
如果你已经搬到科特林,我建议你去看看科特林。它们非常轻量级,对于线程来说非常有效,并为您提供了对生命周期的大量控制。我希望这有帮助。