【发布时间】:2015-12-08 01:21:32
【问题描述】:
getLoaderManager() 来自android.support.v4.app.Fragment 和getSupportLoaderManager() 来自android.support.v4.app.FragmentActivity
他们返回相同的东西吗?我在文档中找不到它。如果不是,应该从片段内部与支持库一起使用哪一个?
【问题讨论】:
标签: android
getLoaderManager() 来自android.support.v4.app.Fragment 和getSupportLoaderManager() 来自android.support.v4.app.FragmentActivity
他们返回相同的东西吗?我在文档中找不到它。如果不是,应该从片段内部与支持库一起使用哪一个?
【问题讨论】:
标签: android
他们返回完全相同的东西 - 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.FragmentActivity(AppCompatActivity只是一个例子);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(),所以应该没有任何区别。
如果您在 (support.v4.app.)Fragment 内使用 Loader(例如,您的列表视图在 Fragment 内,并且加载程序回调设置为 Fragment)您应该使用 Fragment 的getLoaderManager(),而不是调用getActivity().getSupportLoaderManager()。
公认的答案是正确的,两者返回的是同一个东西,但是它们的副作用是不同的:当你使用Fragment的getLoaderManager()时,Fragment的mLoaderManager被设置为指向返回的Loader Manager .只有这样,支持库才会知道如何根据 Fragment 的生命周期来管理加载器管理器(进而管理加载器)。
当 Fragment(但不是 Activity)被销毁时,加载器将停止仅如果您使用 getLoaderManager() 的 Fragment 版本。如果相反,加载器管理器/加载器将不知道片段已被销毁,并且可以在加载完成时调用其回调来调用片段等。
所以你观察到他们行为不同确实应该是正确的。
【讨论】:
这里是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()。我说的是那个。