当前位置: 首页 > 知识库问答 >
问题:

Android AsyncTask vs线程处理程序vs rxjava

严阳夏
2023-03-14

我知道这个问题已经被问过很多次了。但是有些事情我从来没有找到答案。所以希望有人能给我一些启发。

我们都知道,AsyncTask和Thread是执行后台任务以避免ANR问题的选项。建议asynctask只能用于短期运行的任务,而线程可以用于长期运行的任务。asynctask不应用于长任务的原因是众所周知的,这与asynctask可能导致的泄漏有关,因为它可能在活动销毁后继续运行。这很有说服力。然而,这也导致了一些其他问题:

  1. 线程是否也独立于活动生命周期?因此,asynctask的风险也可以应用于线程。那么,为什么线程适合长时间运行的任务呢
  2. 看起来asynctask的风险仅在与活动一起使用时适用。如果我们在服务中使用它(不是IntentService,因为IntentService在其工作完成后停止),并且只要我们能够保证在服务停止时取消asyntask,我们可以将其用于长时间运行的任务吗?这难道不意味着在服务中使用asynctask是无风险的吗
  3. 我已经玩了一段时间rxjava,非常喜欢它。它消除了对线程的担忧(除非您必须决定在哪个线程中订阅并观察发出的数据)。据我所见,rxjava(与其他一些LIB(如改装)结合使用)似乎是asynctask和thread的完美替代品。我想知道我们是否可以完全忘记它们,或者有什么特定的情况rxjava无法实现asynctask和线程所能做的,我应该知道的

谢啦

共有2个答案

王才英
2023-03-14

AsyncTask和Thread Handler没有精心设计和实现。RxJava、Akka和其他用于异步执行的框架似乎开发得更仔细。

每种技术都有其局限性。AsyncTask适用于能够显示UI进度的单个并行任务。但是,如果重新生成活动(例如,由于屏幕旋转),则会丢失与UI的连接(此问题的一种可能解决方案是https://github.com/rfqu/AsyncConnector)。

线程处理程序即使没有消息要处理,也会为线程堆栈保留内存。这限制了可能的线程数。您可以拥有比处理程序线程更多的Akka参与者RxJava订阅者,具有类似的功能。

臧威
2023-03-14

因为没有人回复。那我就回答我自己的问题。

  1. 为什么AsyncTask只推荐用于短任务(大约5秒)的原因是没有方法可以取消正在运行的AsyncTask。存在一个名为AsyncTask.cancel(true)的方法,它调用onSused(Result结果)。但是,根据文档,此方法“在调用取消(boolean)并完成doInbackground(Object[])之后在UI线程上运行。”(https://developer.android.com/reference/android/os/AsyncTask.html)。另一方面,线程可以使用Thread.interrupt()停止。
  2. Service中运行AsyncTask应该没有任何问题,前提是您知道AsyncTask的取消限制并且内存泄漏的可能性可以由AsyncTask创建。请注意,显然没有必要在已经在工作线程中运行的IntentService中使用AsyncTask
  3. 这是一个非常基于经验的问题。我猜不会有完整的答案。我们可以做的是了解Rx并意识到它的局限性以确定适合使用它的地方。在我的开发工作中,我一直使用RxJava而没有任何问题。请注意,相同的内存泄漏问题也适用于RxJava。您也许可以在这里找到其中一个特定问题。还有一大堆关于使用RxJava处理泄漏/屏幕旋转的讨论,可以通过Google轻松找到。
 类似资料:
  • 我有一个简单的问题。我目前正在使用Netty处理来自客户端的TCP和UDP数据包。我有一个单独的线程上的每个套接字侦听器,它工作得很好。 我现在担心的是,当流量开始严重冲击它时,我不认为每个处理程序只有一个线程来管理消息就足够了。为每条消息生成一个新线程是否正确(我觉得不正确)?或者我应该使用像线程池这样的东西来实现这一点?如有任何建议,将不胜感激。 下面是消息处理程序的一些示例代码。我编写了一些

  • 线程中使用 java.lang.Runnable 如果用户在代码中通过 java.lang.Runnable 新启动了线程或者采用了线程池去异步地处理一些业务,那么需要将 SOFATracer 日志上下文从父线程传递到子线程中去,SOFATracer 提供的 com.alipay.common.tracer.core.async.SofaTracerRunnable 默认完成了此操作,大家可以按照

  • 我正在设置一个Netty服务器来接受多个传入的客户端连接,这将反过来做一些处理,但对wroker线程组vs Handler线程感到困惑 我尝试分配10个工作线程和20个处理线程,如下所示。 我无法理解工作组的任务和创建新服务器处理程序之间的区别。据我所知,处理器线程池将分配给NettyServerHandler的每个实例。但是,创建由10个线程组成的工作组池的作用是什么呢?

  • 我正在尝试使用多个处理器类在处理器步骤中处理记录。这些类可以并行工作。目前我已经编写了一个多线程步骤,其中我 设置处理器类的输入和输出行 提交给遗嘱执行人服务 获取所有未来对象并收集最终输出

  • 问题内容: 我想自己开发一个探查器,我想解释一下我所看到的。即使在最简单的程序中,也总是会出现一些默认线程: 销毁JavaVM 信号调度器 终结器 参考处理程序 尽管他们的名字很能说明问题,但我想获得更多信息。似乎这些线程没有记录在案,是否有人知道挖掘这些信息的来源,甚至确切地知道这些线程的作用? 问题答案: DestroyJavaVM是一个线程,该线程在程序退出时卸载Java VM。在大多数情况

  • 问题内容: 我想在后台线程中运行一些Runnable。我想使用Handler,因为它便于延迟。我的意思是 凡 可运行 应当运行 后台 线程。是否可以创建这样的处理程序?是否在某个地方有“背景” Looper,或者该如何创建? PS我知道如何使用自定义类扩展Thread,但是比处理程序方式需要更多的编码工作。因此,请不要发布其他解决方案或类似的内容 如果Handler能以“干净”的方式做到这一点,我