添加Retrofit功能后Android应用启动崩溃,如何排查定位问题?
问题根因分析
从崩溃栈可以直接定位核心错误:你在MainActivity的类实例初始化阶段(也就是onCreate()生命周期执行之前)就调用了需要系统服务上下文的API,具体是MainActivity.java第56行的getSystemService()调用。Activity在onCreate()执行完成前还没有绑定到系统服务上下文,此时调用系统服务相关API就会直接抛出该异常。
这是Android开发新手非常常见的生命周期误用错误,大概率是你把需要上下文初始化的代码(比如传感器初始化、Retrofit相关的上下文依赖初始化、布局相关服务调用)直接写在了Activity的成员变量初始化位置,或者构造方法里,没有放到onCreate()方法中执行。
修复方案
- 打开
MainActivity.java文件,找到第56行的代码 - 把这行代码以及所有依赖它的初始化逻辑,整体移动到
onCreate()方法里,且要放在super.onCreate(savedInstanceState)调用之后执行
如果你的Retrofit初始化逻辑中用到了Context(比如读取本地配置、设置缓存目录等),同样不能在Activity成员变量初始化阶段执行,必须放到onCreate()中执行。
常见错误写法和正确写法对比
错误写法(直接作为成员变量初始化)
public class MainActivity extends AppCompatActivity { // 错误:初始化时调用getSystemService,此时还没执行onCreate SensorManager sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
正确写法(放到onCreate里初始化)
public class MainActivity extends AppCompatActivity { SensorManager sensorManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 正确:super.onCreate执行完成后再调用系统服务API sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); } }
进一步排查需要提供的信息
MainActivity.java的完整代码- 你新增的Retrofit配置相关代码
- 新建的接收Retrofit返回结果的Activity的代码
内容的提问来源于stack exchange,提问作者Newbie coder
相关产品推荐
相关产品推荐

