最近由于工作原因畜隶,在開(kāi)發(fā)Android
平臺(tái)的一些功能,有一個(gè)地方用到了根據(jù)內(nèi)容修改菜單項(xiàng)的需求。
在iOS
上可以在讀取加載數(shù)據(jù)之后船万,直接修改navigationItem
刻撒,就以為在Android
可以同樣的操作,結(jié)果卻出現(xiàn)了menu
為null
的情況耿导,引發(fā)了crash
声怔。于是把代碼移動(dòng)到了onCreateOptionsMenu
函數(shù)中,結(jié)果又出現(xiàn)了數(shù)據(jù)為null
的情況舱呻,瞬間對(duì)于兩者的調(diào)用順序迷糊了醋火。
今天去網(wǎng)上查了一下在Fragment
中onCreateOptionsMenu
的調(diào)用時(shí)機(jī),又仔細(xì)看了一下我們的代碼箱吕,終于發(fā)現(xiàn)了問(wèn)題所在胎撇,那就是兩者并發(fā)了。
先說(shuō)一下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)用時(shí)間在onStart()
之后晚树。
我們的代碼中是在onActivityCreated(Bundle)
中異步進(jìn)行的數(shù)據(jù)加載,所以有可能出現(xiàn)菜單還沒(méi)有創(chuàng)建完成雅采,就已經(jīng)加載完了數(shù)據(jù)爵憎,導(dǎo)致menu
為null
。
同樣的婚瓜,由于我們的代碼是異步加載數(shù)據(jù)宝鼓,就有存在創(chuàng)建菜單時(shí)數(shù)據(jù)加載未完成的可能,這時(shí)候巴刻,就會(huì)出現(xiàn)數(shù)據(jù)為null
的情況愚铡。
無(wú)奈之下,我最后是采用了一種不太好的辦法胡陪,就是兩者加載完成時(shí)都調(diào)用一個(gè)函數(shù)沥寥,在這個(gè)函數(shù)內(nèi)判斷如果兩者都不為null
,則進(jìn)行菜單項(xiàng)的處理柠座。不過(guò)我相信肯定會(huì)有更好的辦法邑雅,只是一時(shí)之間沒(méi)有想到,如果誰(shuí)知道的話(huà)妈经,希望能夠告訴我一下淮野,非常感謝。