android - Asynctask vs 线程 vs 服务 vs 加载器

标签 android multithreading android-asynctask android-service

我对 Android 中 AsynctaskThreadServiceLoader 之间的区别感到有些困惑。

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

我在 Android 上工作了 3 年,并且通常仍将 AsyncTask 用于所有后台任务(有时是线程)。但是很多人说“Asynctask 已经过时”,不推荐使用。他们还建议使用 robospice 或 Volley。

那么,AsyncTask 真的那么糟糕,我应该使用框架来完成网络任务吗?我应该将什么用于后台(不是网络)任务?

最佳答案

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

AsyncTask:Android 中用于执行后台任务的出色线程库。它由 android 操作系统本身管理,您可以从中更新 UI。它可以并行或串行运行,具体取决于 android 的版本。有时在方向变化的情况下使用它可能会很麻烦,现在为了进行网络调用,您可以使用比 AsyncTask 更好的 volley。 AsyncTasks 不关心他们的父 Activity 是否正在运行,有时取消它可能非常乏味。因此,如果您使用 AsyncTask 来更好地调用其他 API,我建议您使用 RETROFITVOLLEY如果您在两者之间选择 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/

相关文章:

javascript - Cordova 5.1.1 中的 FormData 相机操作不起作用

C++ 11 你能在不同的线程中通过引用安全地传递和访问 std::atomics

java - 编译 Java 使其表现得像 GO 代码

android - 本地缓存 Web 服务响应的最佳实践

android - 在 LinearLayout 中动态添加 View 水平和垂直

android - 如何在android上以编程方式将音量调到最大?

android - RuntimeException:无法在 onPreExecute() 中创建处理程序

Python线程中断休眠

Android:无法在 Asynctask 的 OnPostExecute 方法中获取 doInBackground 结果

java - 使用 org.apache.commons.net.ftp.FTPClient 从 AsyncTask 类登录 FTP 时出错