最近由于工作原因,在开发Android平台的一些功能,有一个地方用到了根据内容修改菜单项的需求。
在iOS上可以在读取加载数据之后,直接修改navigationItem,就以为在Android可以同样的操作,结果却出现了menu为null的情况,引发了crash。于是把代码移动到了onCreateOptionsMenu函数中,结果又出现了数据为null的情况,瞬间对于两者的调用顺序迷糊了。
今天去网上查了一下在Fragment中onCreateOptionsMenu的调用时机,又仔细看了一下我们的代码,终于发现了问题所在,那就是两者并发了。
先说一下Fragment的生命周期:
onAttach(Activity)onCreate(Bundle)onCreateView(LayoutInflater, ViewGroup, Bundle)onActivityCreated(Bundle)onViewStateRestored(Bundle)onStart()onResume()onPause()onStop()onDestoryView()onDestory()onDetach()
而创建菜单的函数是onCreateOptionsMenu,它的调用时间在onStart()之后。
我们的代码中是在onActivityCreated(Bundle)中异步进行的数据加载,所以有可能出现菜单还没有创建完成,就已经加载完了数据,导致menu为null。
同样的,由于我们的代码是异步加载数据,就有存在创建菜单时数据加载未完成的可能,这时候,就会出现数据为null的情况。
无奈之下,我最后是采用了一种不太好的办法,就是两者加载完成时都调用一个函数,在这个函数内判断如果两者都不为null,则进行菜单项的处理。不过我相信肯定会有更好的办法,只是一时之间没有想到,如果谁知道的话,希望能够告诉我一下,非常感谢。









网友评论