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