問(wèn)題描述:
首頁(yè)跳到listView列表頁(yè) 報(bào)錯(cuò):System services not available to Activities before onCreate()
問(wèn)題代碼:
adapter初始話的時(shí)候晦毙,使用了context上下文啤贩。如圖:
但是 在activity中,adapter是在oncreate之前朴皆,在聲明全局變量的時(shí)候直接初始化的奄抽,這個(gè)時(shí)候context還是null喊废,所以報(bào)錯(cuò)绅这。代碼圖如下圖:
最終定位到糯累,代碼報(bào)錯(cuò)的位置
分析原因
android采用的是java語(yǔ)言算利,但是和普通的java程序不同,并不是隨便創(chuàng)建一個(gè)類泳姐,寫一個(gè)main方法就能運(yùn)行效拭。android程序的運(yùn)行需要上下文的環(huán)境context,activity是一個(gè)java類,但他不是一個(gè)普通的java類缎患,他是android的四大組件之一慕的。普通的java類是通過(guò)關(guān)鍵字new 的方式進(jìn)行初始化,activity必須通過(guò)context.startActivity()挤渔。
根據(jù)上面報(bào)錯(cuò)的位置肮街,原因是mBase 為null
那么,mBase 在哪里進(jìn)行賦值的呢判导?
activity繼承ContextThemeWrapper嫉父,ContextThemeWrapper繼承ContextWrapper。在activity的關(guān)鍵方法attach()中發(fā)現(xiàn)了attachBaseContext()
第二步眼刃,繼續(xù)向上查找熔号,哪里調(diào)用了activity的attach。我們都是到activity啟動(dòng)的入口是activityThread類的performLaunchActivity()方法鸟整,在此方法中找到
箭頭1:創(chuàng)建activity實(shí)例引镊,
箭頭2:把上下文context attach到activity,
到此篮条,找到了報(bào)錯(cuò)的最終原因弟头。activity實(shí)例化的時(shí)候,先adapter初始化涉茧,但此時(shí)context還沒(méi)有attach到activity赴恨。