【问题标题】:Android AsyncTask vs Thread + Handler vs rxjavaAndroid AsyncTask vs Thread + Handler vs rxjava
【发布时间】:2017-02-13 07:06:24
【问题描述】:

我知道这是被问过很多次的问题。但是,有些事情我从未找到答案。所以希望有人能给我一些启示。

我们都知道 AsyncTask 和 Thread 是执行后台任务以避免 ANR 问题的选项。建议 asynctask 只用于短时间运行的任务,而 thread 可用于长时间运行的任务。 asynctask 不应该用于长任务的原因是众所周知的,这是关于 asynctask 可能导致的泄漏,因为它可能在活动被破坏后继续运行。这是令人信服的。但是,这也导致了一些其他问题:

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

谢谢

【问题讨论】:

    标签: android multithreading android-asynctask rx-java android-handler


    【解决方案1】:

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

    1. AsyncTask 仅推荐用于短任务(大约 5 秒)的原因是无法取消正在运行的AsyncTask。存在一个名为AsyncTask.cancel(true) 的方法,它调用onCancelled(Result result)。但是,根据文档,此方法“在调用 cancel(boolean) 并且 doInBackground(Object[]) 完成后在 UI 线程上运行。” (https://developer.android.com/reference/android/os/AsyncTask.html)。另一方面,Thread 可以用Thread.interrupt() 停止。
    2. Service 中运行AsyncTask 应该没有任何问题,前提是您知道AsyncTask 的取消限制并且内存泄漏的可能性可以由AsyncTask 创建。请注意,显然没有必要在已经在工作线程中运行的IntentService 中使用AsyncTask
    3. 这是一个非常基于经验的问题。我想不会有完整的答案。我们可以做的是了解 Rx 并意识到它的局限性,以确定在哪里适合使用它。在我的开发工作中,我一直使用RxJava,没有任何问题。请注意,同样的内存泄漏问题也适用于RxJava。您也许可以找到具体问题之一here。还有一大堆关于使用RxJava 处理泄漏/屏幕旋转的讨论可以通过谷歌搜索轻松找到。

    【讨论】:

      【解决方案2】:

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

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

      Thread+Handler 为线程堆栈保留内存,即使没有消息要处理。这限制了可能的线程数。您可以拥有比处理程序线程更多的Akka actorsRxJava Subscribers,具有类似的功能。

      【讨论】:

      • 感谢您的回答。所以这意味着总是使用 rxjava 而不是 Asynctask 和 Thread 吗?您能否澄清答案中“小心”的含义?谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 2018-02-18
      • 2012-10-30
      • 2020-12-21
      • 2011-03-25
      • 1970-01-01
      • 2019-09-27
      相关资源
      最近更新 更多