最近由于工作原因,在开发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
,则进行菜单项的处理。不过我相信肯定会有更好的办法,只是一时之间没有想到,如果谁知道的话,希望能够告诉我一下,非常感谢。