Android Honeycomb:如何确定FragmentTransaction.commit()何时完成?

时间:2011-06-08 09:53:50

标签: android android-3.0-honeycomb android-fragments

我有这段简单的代码:

public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager fragmentManager = getFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    //...

    NetworkWorker networkFragment = NetworkWorker.createInstance(null);
    fragmentTransaction.add(networkFragment, NETWORK);

    //...

    fragmentTransaction.commit();

    networkFragment.startURLRequest("test");
}
当我在getActivity()例程中调用startURLRequest()时,

崩溃了。

我将startURLRequest()电话移至onStart()后,工作正常。

所以我用Google搜索了一下,发现了这个:

  

调用commit()不会立即执行事务。相反,它会在线程能够执行时将其安排在活动的UI线程(“主”线程)上运行。但是,如果需要,您可以从UI线程调用executePendingTransactions()以立即执行commit()提交的事务。除非事务是其他线程中作业的依赖项,否则通常不需要这样做。   [AndDev guide]

现在,我的问题是......是否真的建议使用这个executePendingTransactions()或者这会有一些陷阱吗?还有另一种方法来确定交易是否已经完成?只是猜测它们可能在活动的下一个例程中完成似乎并不令人满意。

亲切的问候, 水母

2 个答案:

答案 0 :(得分:4)

也许你正在以错误的方式思考这个问题。而不是从活动中调用您的片段中的startURLRequest,为什么不在您的片段的startURLRequestonAttach等方法中调用onCreate,因为您知道该片段已附加到活动和getActivity()将成功。

在我看来,片段应该决定何时调用startURLRequest而不是活动。否则,您的活动必须进行测试以确保片段与片段相关联。

答案 1 :(得分:1)

可以假设当事务中的所有片段都从onResume返回时(对于要添加的片段),提交已完成。