问题描述:
首页跳到listView列表页 报错:System services not available to Activities before onCreate()
问题代码:
adapter初始话的时候,使用了context上下文。如图:
bb.png
但是 在activity中,adapter是在oncreate之前,在声明全局变量的时候直接初始化的,这个时候context还是null,所以报错。代码图如下图:
aa.png
最终定位到,代码报错的位置
image.png
分析原因
android采用的是java语言,但是和普通的java程序不同,并不是随便创建一个类,写一个main方法就能运行。android程序的运行需要上下文的环境context,activity是一个java类,但他不是一个普通的java类,他是android的四大组件之一。普通的java类是通过关键字new 的方式进行初始化,activity必须通过context.startActivity()。
根据上面报错的位置,原因是mBase 为null
image.png
那么,mBase 在哪里进行赋值的呢?
image.png
activity继承ContextThemeWrapper,ContextThemeWrapper继承ContextWrapper。在activity的关键方法attach()中发现了attachBaseContext()
image.png
第二步,继续向上查找,哪里调用了activity的attach。我们都是到activity启动的入口是activityThread类的performLaunchActivity()方法,在此方法中找到
image.png
箭头1:创建activity实例,
箭头2:把上下文context attach到activity,
到此,找到了报错的最终原因。activity实例化的时候,先adapter初始化,但此时context还没有attach到activity。
网友评论