为什么在MainActivity中直接初始化MediaPlayer会导致应用崩溃
Android MediaPlayer 成员变量初始化崩溃问题解析
核心原因是Activity 上下文(Context)的就绪时机和类成员变量初始化顺序不匹配,具体逻辑如下:
- 类成员变量的初始化动作发生在Activity实例创建阶段,早于
onCreate()生命周期方法执行。此时Activity的Context还未完成系统初始化,属于无效上下文。 MediaPlayer.create()方法依赖有效的Activity Context才能成功创建实例,传入无效上下文时会创建失败返回null。
可运行代码逻辑说明
public class MainActivity extends AppCompatActivity { MediaPlayer audio = MediaPlayer.create(this, R.raw.my_audio); public void play(View view){ audio.start(); } public void pause(View view){ audio.pause(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); audio = MediaPlayer.create(this, R.raw.my_audio); } }
虽然成员声明阶段的初始化传入了无效Context,得到的是null值,但onCreate()执行时super.onCreate已经完成了Context初始化,此处重新对audio变量赋值得到有效实例,后续调用play/pause方法操作的都是有效对象,因此不会崩溃。
崩溃代码逻辑说明
public class MainActivity extends AppCompatActivity { MediaPlayer audio = MediaPlayer.create(this, R.raw.my_audio); public void play(View view){ audio.start(); } public void pause(View view){ audio.pause(); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
该代码仅在成员变量初始化阶段创建MediaPlayer,audio最终被赋值为null,且没有在onCreate()中重新赋值。触发play方法时会直接对空对象调用start(),触发空指针异常导致应用崩溃。
开发建议
- 所有依赖Activity Context的实例初始化,统一放在
onCreate()方法中执行,不要在成员变量声明阶段直接初始化 - MediaPlayer使用完成后要及时调用
release()方法释放资源,避免内存泄漏
内容的提问来源于stack exchange,提问作者Lina
相关产品推荐
相关产品推荐

