为什么在尝试实例化 Mediaplayer 时会出现 NullPointerException? Android 科特林
Why do I get NullPointerException when trying to instantiate Mediaplayer? Android Kotlin
package com.oyly.gpsdemo
import android.content.Context
import android.media.MediaPlayer
class SoundGenerator(context: Context) : MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener {
private var mediaPlayer: MediaPlayer = MediaPlayer()
private var nextSound: Int = R.raw.coast
init {
try { mediaPlayer = MediaPlayer.create(context, R.raw.coast) }
catch (ex : Exception) { println("lyseoy11: $ex") }
mediaPlayer.setOnPreparedListener(this)
mediaPlayer.setOnCompletionListener (this)
}
override fun onPrepared(p0: MediaPlayer) {mediaPlayer.start()}
override fun onCompletion(p0: MediaPlayer?) { playSound() }
fun queueSound(resid: Int) {
nextSound = resid
if (!mediaPlayer.isPlaying) playSound()
}
fun playSound() {
mediaPlayer.reset()
mediaPlayer.setDataSource(resources.openRawResourceFd(nextSound))
mediaPlayer.prepareAsync()
}
}
“mediaPlayer = MediaPlayer.create(context, R.raw.coast”行抛出以下异常:
java.lang.NullPointerException: 尝试在空对象引用
上调用虚拟方法'android.content.res.Resources android.content.Context.getResources()'
我已将这段代码从它运行的独立应用程序移到另一个应用程序的 class 中。现在它不起作用,我不明白为什么。 MediaPlayer.Create() 方法将上下文作为参数(我从调用此 class 的 MainActivity class 传递)和要播放的音频文件的 uri。它们都不为空。
为什么我会得到这个异常?
编辑:
唯一创建 SoundGenerator 的地方是在 MainActivity Initializer 中:
class MainActivity : AppCompatActivity() {
private var soundGenerator : SoundGenerator = SoundGenerator(this)
...
}
通常,最好等到生命周期的后期(例如在 onCreate
中)设置好之后再使用 activity 作为上下文,以避免初始化顺序问题。例如:
class MainActivity : AppCompatActivity() {
private lateinit var soundGenerator : SoundGenerator
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//...
soundGenerator = SoundGenerator(this)
}
}
或者,有时您可以使用 applicationContext
而不是当前的 activity 作为合适的上下文。
package com.oyly.gpsdemo
import android.content.Context
import android.media.MediaPlayer
class SoundGenerator(context: Context) : MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener {
private var mediaPlayer: MediaPlayer = MediaPlayer()
private var nextSound: Int = R.raw.coast
init {
try { mediaPlayer = MediaPlayer.create(context, R.raw.coast) }
catch (ex : Exception) { println("lyseoy11: $ex") }
mediaPlayer.setOnPreparedListener(this)
mediaPlayer.setOnCompletionListener (this)
}
override fun onPrepared(p0: MediaPlayer) {mediaPlayer.start()}
override fun onCompletion(p0: MediaPlayer?) { playSound() }
fun queueSound(resid: Int) {
nextSound = resid
if (!mediaPlayer.isPlaying) playSound()
}
fun playSound() {
mediaPlayer.reset()
mediaPlayer.setDataSource(resources.openRawResourceFd(nextSound))
mediaPlayer.prepareAsync()
}
}
“mediaPlayer = MediaPlayer.create(context, R.raw.coast”行抛出以下异常:
java.lang.NullPointerException: 尝试在空对象引用
上调用虚拟方法'android.content.res.Resources android.content.Context.getResources()'我已将这段代码从它运行的独立应用程序移到另一个应用程序的 class 中。现在它不起作用,我不明白为什么。 MediaPlayer.Create() 方法将上下文作为参数(我从调用此 class 的 MainActivity class 传递)和要播放的音频文件的 uri。它们都不为空。
为什么我会得到这个异常?
编辑:
唯一创建 SoundGenerator 的地方是在 MainActivity Initializer 中:
class MainActivity : AppCompatActivity() {
private var soundGenerator : SoundGenerator = SoundGenerator(this)
...
}
通常,最好等到生命周期的后期(例如在 onCreate
中)设置好之后再使用 activity 作为上下文,以避免初始化顺序问题。例如:
class MainActivity : AppCompatActivity() {
private lateinit var soundGenerator : SoundGenerator
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//...
soundGenerator = SoundGenerator(this)
}
}
或者,有时您可以使用 applicationContext
而不是当前的 activity 作为合适的上下文。