最近由于工作原因,在開發(fā)Android
平臺的一些功能,有一個地方用到了根據(jù)內(nèi)容修改菜單項的需求。
在iOS
上可以在讀取加載數(shù)據(jù)之后,直接修改navigationItem
,就以為在Android
可以同樣的操作,結(jié)果卻出現(xiàn)了menu
為null
的情況,引發(fā)了crash
。于是把代碼移動到了onCreateOptionsMenu
函數(shù)中,結(jié)果又出現(xiàn)了數(shù)據(jù)為null
的情況,瞬間對于兩者的調(diào)用順序迷糊了。
今天去網(wǎng)上查了一下在Fragment
中onCreateOptionsMenu
的調(diào)用時機(jī),又仔細(xì)看了一下我們的代碼,終于發(fā)現(xiàn)了問題所在,那就是兩者并發(fā)了。
先說一下Fragment
的生命周期:
onAttach(Activity)
onCreate(Bundle)
onCreateView(LayoutInflater, ViewGroup, Bundle)
onActivityCreated(Bundle)
onViewStateRestored(Bundle)
onStart()
onResume()
onPause()
onStop()
onDestoryView()
onDestory()
onDetach()
而創(chuàng)建菜單的函數(shù)是onCreateOptionsMenu
,它的調(diào)用時間在onStart()
之后。
我們的代碼中是在onActivityCreated(Bundle)
中異步進(jìn)行的數(shù)據(jù)加載,所以有可能出現(xiàn)菜單還沒有創(chuàng)建完成,就已經(jīng)加載完了數(shù)據(jù),導(dǎo)致menu
為null
。
同樣的,由于我們的代碼是異步加載數(shù)據(jù),就有存在創(chuàng)建菜單時數(shù)據(jù)加載未完成的可能,這時候,就會出現(xiàn)數(shù)據(jù)為null
的情況。
無奈之下,我最后是采用了一種不太好的辦法,就是兩者加載完成時都調(diào)用一個函數(shù),在這個函數(shù)內(nèi)判斷如果兩者都不為null
,則進(jìn)行菜單項的處理。不過我相信肯定會有更好的辦法,只是一時之間沒有想到,如果誰知道的話,希望能夠告訴我一下,非常感謝。