我从ListFragment外部调用restartLoader()时遇到了一些问题。该序列根据点击“添加”按钮打开一个活动 - >输入数据 - >点击Save,启动AsyncTask以在服务器上存储数据。成功传输数据后,返回上一个活动 - >让Activity调用ListFragment中运行getLoaderManager()。restartLoader()的方法。
这肯定会创建一个“java.lang.IllegalStateException:Fragment ListsFragment {42481238}未附加到Activity”-error。如果我将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?
答案 0 :(得分:3)
您不应该从ListFragment
刷新FragmentActivity
...这违反了Fragment
的两个基本设计指南(它们应该是为了重复使用而设计的)不依赖于任何特定活动)和LoaderManager
(假设属于单个Activity
或Fragment
)。您应该让ListFragment
实现LoaderManager.LoaderCallbacks<D>
界面。
另外,Loader
应该在其基础数据源发生更改时接收通知,表示它们执行新的异步加载并将结果返回给回调的onLoadFinished
方法。如果您必须依靠restartLoader
来获取最新数据,那么您就做错了(即您的ContentObserver
未收到有关Loader
信号的通知1}}重新查询其数据。)
答案 1 :(得分:0)
如果我理解正确,你有一个活动A创建了一个加载器,它有一个菜单选项来通过活动B保存数据。一旦活动B保存了数据,你希望活动A中的加载器重新启动... am我没错?
如果是这样,请尝试在活动B中执行此操作:
public interface onSavedDataListener {
void DoneSavingData(); //add parameters if needed
}
... //Whatever other code you have
//This method should be called from your AsyncTask onFinished() method
public void dataSaved() { //add parameters if needed
onSavedDataListener activity = (onSavedDataListener) getActivity();
activity.DoneSavingData(); //make sure you add the same parameters as you did above
}
然后在活动A中,您将实现侦听器
public class ActivityA extends ListFragment implements onSavedDataListener {
... //your other code here
//Add the listener function
public void DoneSavingData() { //make sure any parameters you have get added here
getLoaderManager().restartLoader(id, args, loadercallback);
}
...
实质上,您在Activity B中创建了一个在Activity A中实现的侦听器对象。我希望我是对的,它会帮助你...