【问题标题】:Is it necessary for a AsyncTask to be an inner class?AsyncTask 是否需要成为内部类?
【发布时间】:2021-08-29 02:12:56
【问题描述】:

我听说 AsyncTask 并不是很有用,因为在 AsyncTask 完成其功能之前,如果手机的方向发生变化,作为 AsyncTask 的父级的 Activity 不能被销毁以释放内存(如它是一个内部类,它包含父类的引用)。那么,如果我们不将 AsyncTask 声明为内部类,而是将其定义为一个独立的类,那会怎样......那么这个内存泄漏问题会得到解决吗?

【问题讨论】:

  • "那么这个内存泄漏问题会得到解决吗?" - 可能不是。使用AsyncTask 有一些方法可以避免内存泄漏,但它们往往很复杂,例如使用保留片段来管理AsyncTask。相反,有很多方法可以搞砸。这就是 Google 去年正式弃用 AsyncTask 的原因,这是一个强烈的信号,表明您应该考虑替代方案:RxJava、Kotlin 协程、LiveData 等。

标签: android multithreading android-asynctask


【解决方案1】:

如果您想要嵌套类,请始终创建一个扩展 AsyncTask 的 静态 嵌套类。因为静态嵌套类的实例不保留对其封闭类的引用。您可以使用 Wea​​kReference 来保持对封闭成员的引用(如有必要)。

那么,如果我们不将 AsyncTask 声明为内部类并且 将它定义为一个独立的类......将这个记忆 那么泄漏问题解决了吗?

这取决于,如果您对某些 Activity/Fragment/UI 类保持强引用,可能会发生泄漏。使用单例模式可能有助于应对内存泄漏。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多