我在从 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
(它应该属于单个 Activity
或 Fragment
)。你应该有你的ListFragment
实现LoaderManager.LoaderCallbacks<D>
而是接口(interface)。
另外说明,Loader
当底层数据源发生更改时,应该会收到通知,指示它们执行新的异步加载并将结果返回到回调的 onLoadFinished
方法。如果一定要靠restartLoader
要获取最新的数据,那么您就做错了(即您的 ContentObserver
没有收到通知,而该更改本来会向 Loader
发出信号以重新查询其数据)。
关于android - 来自 FragmentActivity 的 Fragment 中的 RestartLoader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11587310/