FragmentActivity中Fragle中的RestartLoader

时间:2012-07-20 21:42:41

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

我从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?

2 个答案:

答案 0 :(得分:3)

您不应该从ListFragment刷新FragmentActivity ...这违反了Fragment的两个基本设计指南(它们应该是为了重复使用而设计的)不依赖于任何特定活动)和LoaderManager(假设属于单个ActivityFragment)。您应该让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中实现的侦听器对象。我希望我是对的,它会帮助你...