【问题标题】:What is logic behind before super.method or after super.method in android?android中super.method之前或super.method之后背后的逻辑是什么?
【发布时间】:2015-02-07 00:07:26
【问题描述】:

大家好,我想问一下如果我在 super.onDestroyView(); 之前写的东西有什么区别;在 super.onDestroyView(); 之后见下面的例子

在 super.ondestoryview() 之前移除片段;

@Override
    public void onDestroyView() {

        try {
            Fragment fragment = (getFragmentManager()
                    .findFragmentById(R.id.mapviews));
            FragmentTransaction ft = getActivity().getSupportFragmentManager()
                    .beginTransaction();
            ft.remove(fragment);
            ft.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }
        super.onDestroyView();
    }

在 super.ondestoryview() 之后移除片段;

@Override
    public void onDestroyView() {
        super.onDestroyView();
        try {
            Fragment fragment = (getFragmentManager()
                    .findFragmentById(R.id.mapviews));
            FragmentTransaction ft = getActivity().getSupportFragmentManager()
                    .beginTransaction();
            ft.remove(fragment);
            ft.commit();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

【问题讨论】:

标签: android methods super


【解决方案1】:

如果 super 是 Fragment,那么你怎么做没有区别,因为 Fragment 的 onDestroyView 什么都不做。但在某些情况下,这很重要。

正如黛安·哈克伯恩所说:

一般规则:在任何类型的初始化过程中,让超类先完成它们的工作;在任何类型的最终确定中,您首先完成您的工作

附:恕我直言,从其他 Fragment 的 onDestroyView 方法中删除片段不是一个好的解决方案。这很奇怪,我认为你应该找到更好的地方来管理你的片段......

【讨论】:

    【解决方案2】:

    有用的答案

    案例1:如果super.onDestroyView中写了一些代码,那么该代码会在你写的代码之后执行。

    案例2:如果super.onDestroyView中写了一些代码,那么会先执行那段代码,然后再执行你写的代码。

    【讨论】:

      【解决方案3】:

      这是 Fragment.java onDestroyView() 的文档:

      /**
       * Called when the view previously created by {@link #onCreateView} has
       * been detached from the fragment.  The next time the fragment needs
       * to be displayed, a new view will be created.  This is called
       * after {@link #onStop()} and before {@link #onDestroy()}.  It is called
       * <em>regardless</em> of whether {@link #onCreateView} returned a
       * non-null view.  Internally it is called after the view's state has
       * been saved but before it has been removed from its parent.
       */
      @CallSuper
      public void onDestroyView() {
          mCalled = true;
      }
      

      该文档的重要行是:Internally it is called after the view's state has been saved but before it has been removed from its parent.

      如果您的onDestroy() 方法不需要对要保存的视图进行任何更改,那么我认为您何时调用super() 并不重要。

      【讨论】:

      • 我试图找出布尔“mCalled”从真到真,再到真......一直到生命周期的原因。 true -> true -> true -> true 等... ... 除非在阶段之间设置为 false,并且旨在告诉片段是否覆盖了超级...,如果这不是这样的,这对我来说有点没有意义。
      【解决方案4】:

      您的代码一般应该在完成最初预期的工作后才开始工作 - 这里需要注意的是,如果 super 的工作改变了您想要使用的任何东西的状态。也就是说,它确实取决于具体情况 - 阅读超级代码 - 有时那些已经在超级化其他东西。

      【讨论】:

        【解决方案5】:

        onDestroy() 应该在你完成清理处理后调用。它是一种很好的编码实践,可以减少错误的编程。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-06
          • 2017-10-17
          • 1970-01-01
          • 2019-09-19
          • 2018-06-18
          • 2020-05-22
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多