Java 从静态内部类调用非静态方法

Java 从静态内部类调用非静态方法,java,android,Java,Android,我是Android新手,我面临这样一个问题:当我从静态内部类调用非静态方法时,我有nullPointerException,下面是我的代码 public void playPauseMusic() { // check for already playing if (mp.isPlaying()) { if (mp != null) { mp.pause(); // Changing button image to

我是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();
    }
}
这可能是一个简单的概念,但我对安卓系统还不熟悉,这就是为什么要问这个问题。好心帮忙

MainActivity mc = new MainActivity();
实例化新活动没有任何意义。相反,您需要找到
MainActivity
的现有实例,并调用它所需的方法


此外,使用活动播放音乐也不是一个好主意。考虑使用.

,最有可能的是,代码的这部分不像你期望的那样工作:

MainActivity mc = new MainActivity();
mc.playPauseMusic();
这实际上创建了
MainActivity
的一个新实例,并调用其方法
playPauseMusic()
。新的
MainActivity
s
mp
为空,因此访问它会导致NPE

问题是,
newmainActivity()不会像您预期的那样返回已经运行的活动实例。更糟糕的是:这不是实例化
活动的方式。通常,
活动
通过系统解决的
意图启动。
活动
的所有实例化都由系统完成,这是
活动
获取其
上下文的唯一方法


如果您需要,请查看如何从
广播接收器启动
活动
。还要注意,在
活动的背景中播放音乐是个坏主意。建议使用
服务

发布堆栈跟踪。