android - 来自 FragmentActivity 的 Fragment 中的 RestartLoader

标签 android android-fragments android-viewpager android-loadermanager

我在从 ListFragment 外部调用 restartLoader() 时遇到了一些问题。该顺序按照点击“添加”按钮打开 Activity -> 输入数据 -> 点击保存,这会启动 AsyncTask 将数据存储在服务器上。数据传输成功后,返回到上一个 Activity -> 让该 Activity 调用 ListFragment 中运行 getLoaderManager().restartLoader() 的方法。

这毫无疑问总是会创建“java.lang.IllegalStateException:Fragment ListsFragment{42481238} 未附加到 Activity”错误。如果我将 restartLoader() 移至 onResume,效果会稍微好一点,但我还有其他按钮可以直接修改连接到 ListFragments 的数据,无论如何,它们仍然会触发 IllegalStateException。

摘录自 logcat 的错误消息

E/AndroidRuntime(29594): java.lang.IllegalStateException: Fragment ListsFragment{42450b18} not attached to Activity
E/AndroidRuntime(29594):        at android.support.v4.app.Fragment.getLoaderManager(Fragment.java:768)
E/AndroidRuntime(29594):        at testpager.ListsFragment.resetList(ListsFragment.java:122)

我错过了什么?如何从 FragmentActivity 刷新 ListFragment 而不触发此异常?

最佳答案

您不应该刷新您的ListFragment来自FragmentActivity ...这违背了两者的基本设计准则 Fragment s(应该是为重用而设计的,不与任何一项特定 Activity 绑定(bind))和 LoaderManager (它应该属于单个 ActivityFragment )。你应该有你的ListFragment实现LoaderManager.LoaderCallbacks<D>而是接口(interface)。

另外说明,Loader当底层数据源发生更改时,应该会收到通知,指示它们执行新的异步加载并将结果返回到回调的 onLoadFinished方法。如果一定要靠restartLoader要获取最新的数据,那么您就做错了(即您的 ContentObserver 没有收到通知,而该更改本来会向 Loader 发出信号以重新查询其数据)。

关于android - 来自 FragmentActivity 的 Fragment 中的 RestartLoader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11587310/

相关文章:

android - SupportMapFragment -- map fragment 可见性

java - 如何从 ViewPager 的 onPageSelected 异步任务到 fragment ?

android - 为什么不能在 Fragment 中使用 ViewPager?它实际上是

android - 设置功能的时间限制然后强制应用内购买android

android - 什么可以安全地用作 EXTRA_OUTPUT

android - 如何在android中发送带有图像作为附件的邮件?

java - 带有 recyclerview 和 tablayout 的动态高度 viewpager

android - Android 上的 OpenGL ES 2 : how to use VBOs

android - 滚动选项卡中的 fragment 时隐藏/显示工具栏

android - 如何在 Android 中将 Circle Page Indicator 置于最前面