java - 我的代码有什么问题,请帮助我
问题描述
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 文件播放音频的应用程序,但我的代码似乎有问题,因为它不起作用,请帮助我。
解决方案
首先,您的MediaPlayer
实例应该驻留在MainActivity
,而不是MyListener
,也不MyListener
应该扩展活动。实际上,您应该将所有代码从MyListener
移至MainActivity
,在您提供的代码段中我并没有真正看到它的用途。
其次,您正在创建Activity LifecycleMediaPlayer
之外,同时仍在尝试将 Context 传递给它:
public class MainActivity extends AppCompatActivity {
MediaPlayer musicPlayer = MediaPlayer.create(this, R.raw.sound_file);
...
}
在活动生命周期开始之前,活动没有上下文(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);
}
...
}
为了解决您的评论,这里有一个示例,说明它如何适合您MainActivity
使用lambdas:
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());
}
}
推荐阅读
- java - 如何设置一个值JSP/Servlet 中的标记?
- javascript - 当页面的宽度或高度发生变化时反应检测设备
- python - 如何使用 python“子进程”模块获取 Ubuntu 终端的输出
- git - 查找 Master 中的所有提交是否都在发布分支中
- reactjs - 如何在 react.js 的功能组件中将 JSON 对象添加到数组状态
- c# - 如何通过 TimeSpan 属性对实体进行排序?
- mongodb - 为什么连接到两个辅助实例时可以写入 MongoDB PSS 副本集?
- sql-server - 从 SQL Server 审核日志中获取表名
- c# - 如何在.Net中不使用第三方库进行拼写检查
- php - PHP 在不同的 php 文件中定义常量