2

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

这毫无疑问总是会创建一个“java.lang.IllegalStateException: Fragment ListsFragment{42481238} not attach to 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?

4

2 回答 2

3

您不应该从...刷新您ListFragmentFragmentActivity...这违反了两个Fragments 的基本设计准则(应该是为重用而设计的,并且不与任何特定活动相关联)和LoaderManager(应该属于一个单一的ActivityFragment)。您应该改为ListFragment实现LoaderManager.LoaderCallbacks<D>接口。

在单独的说明中,Loaders 应该在其基础数据源更改时接收通知,通知它们执行新的异步加载并将结果返回给回调的onLoadFinished方法。如果您必须依靠restartLoader获取最新数据,那么您就做错了(即您ContentObserver没有被通知可能会发出Loader重新查询其数据的更改的通知)。

于 2012-07-25T02:25:57.820 回答
0

如果我理解正确,您的活动 A 创建了一个加载程序,该加载程序具有通过 Activity B 保存数据的菜单选项。一旦 Activity B 保存了数据,您希望重新启动 Activity A 中的加载程序......我说得对吗?

如果是这样,请尝试在活动 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 中实现的侦听器对象。我希望我是对的,它会帮助您...

于 2012-07-25T02:03:11.343 回答