Asynctask vs Thread vs Services vs Loader

Suv*_*ica 32 multithreading android android-service android-asynctask

我稍微感到困惑之间的差异Asynctask,Thread,Service,Loader在Android系统.

我知道它是如何工作的.但我仍然不明白我应该使用什么以及何时使用.

我使用Android工作了3年,并且通常仍然AsyncTask用于所有后台任务(有时候用于Thread).但是很多人说"Asynctask已经过时了",不建议使用它们.他们还建议使用robospice或Volley.

那么,AsyncTask真的很糟糕,我应该使用框架进行网络任务?我应该将什么用于后台(而不是网络)任务?

Pra*_*dav 26

线程:与Java线程相同,使用它来执行繁重的操作,但是您必须自己管理它,它也可能导致同步问题,并且在UI线程上运行UI之前无法从中更新UI.

AsyncTask:Android中可用于执行后台任务的强大线程库.它由Android操作系统本身管理,您可以从中更新UI.它根据android的版本并行或串行运行.有时候使用它可能会很麻烦,因为在方向改变的情况下,现在为了进行网络呼叫你可以使用优于AsyncTask.的凌空.AsyncTasks不关心他们的父活动是否正在运行,有时取消它可能会非常繁琐.所以,我想,如果你正在使用的AsyncTask使其余的API调用更好地利用建议你RETROFITVOLLEY,如果你选择在两者之间RETROFIT我建议你看看PICASSO从方形的图像加载另一个真棒库.

服务:对于长期后台任务,您应该使用服务.如果需要,您可以将服务绑定到您的活动.您可以定义它们在同一个线程或不同的线程中运行,您需要在清单中声明它,或者您可以使用IntentService- 在自己的线程中运行的服务变体但在使用之前要小心,不要将它用于长期运行的任务.这是一个单一的运营商.如果您打算使用服务,请评估适合您要求的情况,更好的是正常服务或IntentService

AsyncTask加载器:这与许多方面相同,建议使用带有碎片的加载器,它解决了asynctasks的方向问题.

如果您已经转移到kotlin,我建议您查看Coroutines.这些非常轻巧,对于线程非常有效,并为您提供对生命周期的大量控制.我希望这有帮助.


hum*_*kie 20

AysncTasks并非"过时",因为它们不完整.除其他事项外,如果父活动当前正在运行,则异步任务不会受到影响.出于同样的原因,您可以包含检查以验证上下文是否为空.此外,除非您使用自己的线程池执行程序,否则这些任务将以串行方式执行.

Volley试图填补这些空白,主要涉及与主线程和线程池的同步.如果您希望执行需要平均网络请求的内容,它会表现得最佳; 像一些元数据列表和图像(图片youtube应用程序请求和Facebook应用程序请求的帖子).

通常,Volley的几个优点如下

  1. 它使工作线程了解活动(主线程)
  2. 更轻松的资源优先级,您可以优先考虑下载请求.典型的情况是您将文本优先于图像.
  3. 有效的请求缓存和内存管理.
  4. 扩展
  5. 它为您提供了一个选项,可以在您的活动关闭或重新启动时丢弃您的请求.
  6. 与AsyncTasks相比,数据检索的模式更简单.

在Google I/O中提到的流式传输请求/视频时,Volley的表现非常糟糕.

我并不完全了解robospice.Ps:如果你有时间,请看https://www.youtube.com/watch?v=yhv8l9F44qo

如果您希望进入具有相同基准的其他库,可以进一步阅读. Android网络库的比较:OkHTTP,Retrofit和Volley