【问题标题】:Contexts, AsyncTask and rotation changes上下文、AsyncTask 和轮换更改
【发布时间】:2012-02-12 13:49:27
【问题描述】:

使用 getApplicationContext() 与 AsyncTask 一起工作是否是一种好习惯,以便不必附加和分离 Activity 以避免发生内存泄漏发生旋转变化Activity 被销毁?我认为它应该是正确的,因为我实际上需要一个依赖于空洞应用程序的上下文,而不是 Activity 本身。

更重要的是,在那些情况下最好使用 Activity 作为上下文(因为您需要访问 Activity 显示)...而不是分离它(分配给 null)当它被销毁然后在onCreate()中分配新实例时,可以避免分离吗?所以,只需重新分配新实例,这样我们就可以避免 NullPointerException 的问题,因为总会有要使用的上下文!

【问题讨论】:

    标签: android android-activity android-asynctask rotation android-context


    【解决方案1】:

    This post 及其答案很好地解释了该做什么。 This post 及其答案解释了 AsyncTaskContext 问题背后的一些好的理论。

    【讨论】:

    • 感谢您的回答,第二篇文章对@CommonsWare 的回复有很大帮助。他向我澄清了detach() 以及它为什么起作用.. :)
    【解决方案2】:

    根据我自己的经验,我可以说在大多数情况下,在处理AsyncTask 时,使用Activity 作为你的Context 比使用getApplicationContext() 更好。这是因为大多数时候您需要从 Activity 访问成员,并且只有在 AsyncTask 中有对 Activity 的引用时才允许这样做。

    要回答我关于避免detach() 的问题,让我说,在这种情况下,您可以避免它,或者像@CommonsWare 所述in his answer 那样毫无问题地做它。因此,根据他的说法,我们确信在轮换更改期间 Activity 为空时,我们不会收到 NullPointerException

    onProgressUpdate() 和 onPostExecute() 在 onRetainNonConfigurationInstance() 开始和后续 onCreate() 结束之间暂停

    如果我没记错的话,在新创建的 Activity 的 onCreate() 中不显式分离和重新附加新的主要区别在于,您在重新附加时会在几毫秒后释放旧的 Activity 实例。但两种情况下的最终行为是相同的!

    希望这对其他人有帮助! :)

    【讨论】:

      猜你喜欢
      • 2010-12-27
      • 2011-11-29
      • 2014-02-11
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 2011-01-08
      • 2011-05-23
      • 1970-01-01
      相关资源
      最近更新 更多