我是Android新手,我遇到这个问题,当我从静态内部类调用非静态方法时,我有nullPointerException,下面是我的代码。
public void playPauseMusic() {
// check for already playing
if (mp.isPlaying()) {
if (mp != null) {
mp.pause();
// Changing button image to play button
btnPlay.setImageResource(R.drawable.btn_play);
}
} else {
// Resume surah
if (mp != null) {
mp.start();
// Changing button image to pause button
btnPlay.setImageResource(R.drawable.btn_pause);
}
}
}
public static class notifyPlayPauseListner extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("PLAY/Pause Tag","In the listener Play/Pause ");
MainActivity mc = new MainActivity();
mc.playPauseMusic();
}
}
可能是一个简单的概念,但我是Android的新手,这就是为什么要问。请帮助
答案 0 :(得分:3)
MainActivity mc = new MainActivity();
实例化新活动没有任何意义。相反,您需要查找 MainActivity
的现有实例,并将其称为所需的方法。
此外,使用活动播放音乐并不是一个好主意。考虑使用service。
答案 1 :(得分:2)
最有可能的是,这部分代码无法按预期运行:
MainActivity mc = new MainActivity();
mc.playPauseMusic();
这实际上会创建MainActivity
的新实例,并调用其方法playPauseMusic()
。新的MainActivity
s mp
为空,因此访问它会导致NPE。
问题是,new MainActivity();
没有返回正在运行的活动实例,正如您似乎期待的那样。更糟糕的是:那不是你实例化Activity
的方式。通常,Activity
是通过Intents
启动的,由系统解析。 Activity
的所有实例化都由系统完成,这是Activity
获取Context
的唯一方式。
如果您想要的话,请查看this question如何从Activity
启动BroadcastReceiver
。另请注意,从Activity
播放背景音乐是一个坏主意。建议使用Service
。