【问题标题】:Will this Android example be safe to use, memory leak-wise?这个 Android 示例是否可以安全使用,内存泄漏?
【发布时间】:2013-12-18 23:07:57
【问题描述】:

在阅读 Fragments 时,我在 communicating with the activity 上看到了这一部分,其中包含以下 sn-p 代码:

@Override
public void onAttach(Activity activity) {
    super.onAttach(activity);
    try {
        mListener = (OnArticleSelectedListener) activity;
    } catch (ClassCastException e) {
        throw new ClassCastException(activity.toString() + " must implement OnArticleSelectedListener");
    }
}

不知何故,我觉得片段不应该包含对其Activity 的引用,但我真的不知道这种直觉来自哪里。

我觉得当setRetainInstance() 设置为true 时,上面的代码会导致内存泄漏,因为Activity 可能会在方向更改时重新启动,而Fragment 被保留,包含对旧@ 的引用987654328@。 (这是真的吗?)

但是在将setRetainInstance() 设置为false 时使用此模式是否安全?

【问题讨论】:

  • 为什么不在需要时调用 ((OnArticleSelectedListener)getActivity()).listenerMethod() 而不是持有对它的引用?
  • 因为这是 Android 开发指南中的示例代码!在 Fragment 分离后,您可能会得到一个NullPoinerException,我想我的问题归结为!只要您可以调用回调方法,您是否可以假设 Fragment 不会与其活动分离? --AsyncTasks之类的要特别小心。
  • 那么您是否应该在onDetach() 中将mListener 设置回null
  • 你在哪里调用你的回调?
  • 我的应用程序,特别是在 onClick 侦听器中的 ListView 项目,但我的问题是一般性的。

标签: android memory-leaks android-fragments


【解决方案1】:

不知何故,我觉得片段不应该包含对其 Activity 的引用,

他们已经这样做了。否则,getActivity() 方法将无法工作。

我觉得当 setRetainInstance() 设置为 true 时,上面的代码可能会导致内存泄漏,因为在保留 Fragment 时,Activity 可能会在方向更改时重新启动,其中包含对旧 Activity 的引用。 (这是真的吗?)

onAttach() 将再次被调用,用于新的活动,所以虽然你会非常短暂地泄漏内存,但我不会担心。

【讨论】:

    【解决方案2】:

    只需清除 on detach 方法中的指针即可。

    @Override
    public void onDetach() {
        super.onDetach();
    
        mListener = null;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-12
      • 2018-12-30
      相关资源
      最近更新 更多