【问题标题】:What's wrong with my code, please help me [duplicate]我的代码有什么问题,请帮助我[重复]
【发布时间】:2018-09-28 10:17:51
【问题描述】:

MainActivity.java:

    import android.media.MediaPlayer;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;

    public class MainActivity extends AppCompatActivity {

        int currentPosition;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            MyListener myListener = new MyListener();

            Button startButton = (Button) findViewById(R.id.start);
            startButton.setOnClickListener(myListener);

            Button pauseButton = (Button) findViewById(R.id.pause);
            pauseButton.setOnClickListener(myListener);

        }
    }

MyListener.java:

    import android.media.MediaPlayer;
    import android.provider.MediaStore;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;

    public class MyListener extends AppCompatActivity implements View.OnClickListener{

        MediaPlayer musicPlayer = MediaPlayer.create(this, R.raw.sound_file);

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_my_listener);
        }

        @Override
        public void onClick(View v){

            switch(v.getId()){
                case R.id.start:
                    musicPlayer.start();
                    break;
                case R.id.pause:
                    musicPlayer.pause();
                    break;
            }
        }
    }

Logcat 显示如下错误:

    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.musicplayer/com.example.android.musicplayer.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.content.res.Resources android.content.Context.getResources()' on a null object reference

我正在尝试创建一个应用来播放我的 res/raw 文件中的音频,但我的代码似乎有问题,因为它无法正常工作,请帮助我。

【问题讨论】:

  • 在收到onCreate调用之前不能初始化musicPlayer
  • 你的听众不应该扩展AppCompatActivity。它们是特殊用途的类。只有一个 Activity 应该扩展它。实际上,您甚至不需要在这里为侦听器设置不同的类。该代码应该转到MainActivity 本身。

标签: java android nullpointerexception


【解决方案1】:

首先,您的MediaPlayer 实例应驻留在MainActivity 中,而不是MyListener,并且MyListener 不应扩展活动。实际上,您应该将所有代码从 MyListener 移至 MainActivity,我在您提供的 sn-p 中并没有看到它的用途。

其次,您在Activity Lifecycle 之外创建MediaPlayer,同时仍在尝试向其传递上下文:

public class MainActivity extends AppCompatActivity {

    MediaPlayer musicPlayer = MediaPlayer.create(this, R.raw.sound_file);
    ...
}

在 Activity 生命周期开始之前,Activity 没有 Context (this),您在上面编写它的方式等同于在构造函数中定义 musicPlayer

public class MainActivity extends AppCompatActivity {

    MediaPlayer musicPlayer; 

    public MyListener() {
        musicPlayer = MediaPlayer.create(this, R.raw.sound_file);
    }
    ...
}

这也将失败,因为活动生命周期尚未开始。您需要做的是将 musicPlayer 声明为该类的成员,然后在 onCreate() 中创建一个实例,其中 Context 将被初始化:

public class MainActivity extends AppCompatActivity {

    MediaPlayer musicPlayer; 

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_listener);
        musicPlayer = MediaPlayer.create(this, R.raw.sound_file);
    }
    ...
}

为了解决您的评论,这里有一个示例,说明如何使用 lambdas 将其全部融入您的 MainActivity

public class MainActivity extends AppCompatActivity {

    int currentPosition;
    MediaPlayer musicPlayer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        musicPlayer = MediaPlayer.create(this, R.raw.sound_file);

        Button startButton = (Button) findViewById(R.id.start);
        startButton.setOnClickListener(view -> musicPlayer.start());

        Button pauseButton = (Button) findViewById(R.id.pause);
        pauseButton.setOnClickListener(view -> musicPlayer.pause());
    }
}

【讨论】:

  • 感谢您的回答!我想创建一个不同的类来实现监听器,因为我认为这会使我的主要活动不那么聚集,这很愚蠢吗?添加以下公共构造函数后,我的侦听器类正在工作| public MyListener(Context c) { musicPlayer = MediaPlayer.create(c, R.raw.sound_file);我应该在我的 mainactivity 中实现监听器并在那里构建我的代码吗?
  • 好吧,在 Java 8 中引入了 lambda 方法,没有必要定义一个完整的 OnClickListener,我会用一个例子来更新我的答案
  • 但是,如果您想采用这种方法,您的听众仍然可以实现OnClickListener。如果您删除 AppCompatActivity 上的扩展名并通过构造函数传入 Context,则该类的其余部分仍然可以工作,就像您已经完成的那样。
  • Omggg 我刚被介绍过,这比实现监听器或创建匿名类要方便得多,感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-17
  • 1970-01-01
  • 1970-01-01
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多