gpt4 book ai didi

Android AsyncTask 用于长时间运行的操作

转载 作者:IT老高 更新时间:2023-10-28 13:07:18 25 4
gpt4 key购买 nike

引用找到的 AsyncTask 文档 here ,它说:

AsyncTasks should ideally be used for short operations (a few seconds at the most.) If you need to keep threads running for long periods of time, it is highly recommended you use the various APIs provided by the java.util.concurrent pacakge such as Executor, ThreadPoolExecutor and FutureTask.

现在我的问题出现了:为什么? doInBackground() 函数在 UI 线程之外运行,那么在这里长时间运行操作有什么危害?

最佳答案

这是一个非常好的问题,作为一个 Android 程序员需要时间来完全理解这个问题。事实上,AsyncTask 有两个相关的主要问题:

  • 它们与 Activity 生命周期的联系很差
  • 它们很容易造成内存泄漏。

RoboSpice里面Motivations 应用程序 (available on Google Play) 我们详细回答了这个问题。它将深入了解 AsyncTasks、Loaders、它们的特性和缺点,并向您介绍网络请求的替代解决方案:RoboSpice。网络请求是 Android 中的常见需求,本质上是长时间运行的操作.这是应用程序的摘录:

AsyncTask 和 Activity 生命周期

AsyncTasks 不遵循 Activity 实例的生命周期。如果您在 Activity 中启动 AsyncTask 并旋转设备,则 Activity 将被销毁并创建一个新实例。但是 AsyncTask 不会死。它将继续存在,直到完成。

当它完成时,AsyncTask 不会更新新 Activity 的 UI。事实上,它更新了 Activity 的前一个实例,不再显示。这可能导致 java.lang.IllegalArgumentException: View not attach to window manager 类型的异常,如果您例如,使用 findViewById 来检索 Activity 中的 View 。

内存泄漏问题

将 AsyncTasks 创建为 Activity 的内部类非常方便。因为 AsyncTask 需要操作 View 当任务完成或正在进行时,使用 Activity 的内部类似乎很方便:内部类可以直接访问外部类的任何字段。

尽管如此,这意味着内部类将在其外部类实例上持有一个不可见的引用:Activity。

从长远来看,这会产生内存泄漏:如果 AsyncTask 持续很长时间,它会使 Activity 保持“Activity ”而Android想摆脱它,因为它不能再显示了。该 Activity 不能被垃圾收集,这是一个中心Android 在设备上保留资源的机制。


将 AsyncTasks 用于长时间运行的操作确实是一个非常非常糟糕的主意。不过,它们适用于短暂的生命周期,例如在 1 或 2 秒后更新 View 。

我鼓励您下载 RoboSpice Motivations app ,它确实深入地解释了这一点,并提供了执行某些后台操作的不同方法的示例和演示。

关于Android AsyncTask 用于长时间运行的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12797550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com