【问题标题】:Difference between getLoaderManger() and getActivity().getSupportLoaderManager() inside v4.app.Fragmentv4.app.Fragment 中 getLoaderManger() 和 getActivity().getSupportLoaderManager() 的区别
【发布时间】:2015-12-08 01:21:32
【问题描述】:

getLoaderManager() 来自android.support.v4.app.FragmentgetSupportLoaderManager() 来自android.support.v4.app.FragmentActivity

他们返回相同的东西吗?我在文档中找不到它。如果不是,应该从片段内部与支持库一起使用哪一个?

【问题讨论】:

    标签: android


    【解决方案1】:

    他们返回完全相同的东西 - android.support.v4.app.LoaderManager

    从源码看:v4.app.Fragment其实是在召回宿主活动:

     public LoaderManager getLoaderManager() {
         if (mLoaderManager != null) {
             return mLoaderManager;
         }
         if (mActivity == null) {
             throw new IllegalStateException(...);
         }
    
         mLoaderManager = mActivity.getLoaderManager(...);
         return mLoaderManager;
     }
    

    您的活动可能正在扩展v4.app.FragmentActivity,您可以看到getLoaderManager()getSupportLoaderManager() 也调用的私有方法:

    public LoaderManager getSupportLoaderManager() {
        ...
        mLoaderManager = getLoaderManager(...);
        return mLoaderManager;
    }
    

    所以:

    • 要使用v4.app.Fragments,你需要继承v4.app.FragmentActivityAppCompatActivity只是一个例子);
    • v4.app.Fragment.getLoaderManager()v4.app.FragmentActivity.getSupportLoaderManager() 最终都调用了相同的方法,v4.app.FragmentActivity.getLoaderManager()。我很确定两者之间没有任何区别。

    【讨论】:

    • 你有这方面的参考吗?我都试过了,他们的行为似乎不同。 getActivity().getSupportLoaderManager() 似乎与activity 相结合。只要activity 没有,加载程序就不会被破坏。然而,如果 fragment 被破坏,加载器以 v4.app.Fragment 中的 getLoaderManager() 开始似乎被破坏。
    • 他们肯定会返回android.app.LoaderManager 的支持版本,正如所说的android.support.v4.app.LoaderManager。我很确定片段本身正在调用getActivity().getLoaderManager(),所以应该没有任何区别。
    • 当然你创建的LoaderManager是和你用来实例化它的Fragment/Activity实例相关联的,所以如果fragment被销毁,它确实可能会被销毁。
    【解决方案2】:

    如果您在 (support.v4.app.)Fragment 内使用 Loader(例如,您的列表视图在 Fragment 内,并且加载程序回调设置为 Fragment)您应该使用 Fragment 的getLoaderManager(),而不是调用getActivity().getSupportLoaderManager()

    公认的答案是正确的,两者返回的是同一个东西,但是它们的副作用是不同的:当你使用Fragment的getLoaderManager()时,Fragment的mLoaderManager被设置为指向返回的Loader Manager .只有这样,支持库才会知道如何根据 Fragment 的生命周期来管理加载器管理器(进而管理加载器)。

    当 Fragment(但不是 Activity)被销毁时,加载器将停止如果您使用 getLoaderManager() 的 Fragment 版本。如果相反,加载器管理器/加载器将不知道片段已被销毁,并且可以在加载完成时调用其回调来调用片段等。

    所以你观察到他们行为不同确实应该是正确的。

    【讨论】:

      【解决方案3】:

      这里是reference

      他们返回相同的东西吗?

      支持和不支持版本的 LoadManager 做同样的事情,但它们不在同一个包上。基本上getLoaderManager()android.app.Fragment 的伙伴,而getSupportLoaderManager()android.support.v4.app.Fragment 的伙伴。您需要记住,支持库适用于低于 11 的构建 SDK,因此您不能在低于 SDK 11 的版本上使用 android.app.Fragment,但您可以在任何构建版本中使用支持库。

      这是 getLoadManager 返回的内容我无法缩放图片

      LoaderManagerImpl 扩展了作为支持库的一部分的 LoaderManager。

      【讨论】:

      • android.support.v4.app.Fragment 中也有一个getLoaderManager()。我说的是那个。
      • 我只想评论所有内容,尽管我没有 50 个代表。如果您可以显示屏幕截图,我可以看到吗?
      • 在 android.support.v4.app.Fragment 中也有一个 getLoaderManager()
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多