我有这段简单的代码:
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()
或者这会有一些陷阱吗?还有另一种方法来确定交易是否已经完成?只是猜测它们可能在活动的下一个例程中完成似乎并不令人满意。
亲切的问候, 水母
答案 0 :(得分:4)
也许你正在以错误的方式思考这个问题。而不是从活动中调用您的片段中的startURLRequest
,为什么不在您的片段的startURLRequest
,onAttach
等方法中调用onCreate
,因为您知道该片段已附加到活动和getActivity()将成功。
在我看来,片段应该决定何时调用startURLRequest
而不是活动。否则,您的活动必须进行测试以确保片段与片段相关联。
答案 1 :(得分:1)
可以假设当事务中的所有片段都从onResume返回时(对于要添加的片段),提交已完成。