java - 关于我的音板 android 应用程序的内存问题的问题 (E/MediaPlayerNative: error (1, -19))
问题描述
我有播放声音的按钮,它们都可以单独工作,使用 14 次以上后,如果我不重新启动应用程序,它们将不再工作
每次使用后已经尝试过mediaplayer.realease,不起作用,认为是内存问题不知道如何处理
MediaPlayer SonDeadliest
protected void onCreate(Bundle savedInstanceState)
{
boutonDeadliest.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
SonDeadliest = MediaPlayer.create(getApplicationContext(),R.raw.themostdeadliestganginuganda);
SonDeadliest.start();
fin(SonDeadliest);
}
});
public void fin(MediaPlayer m)
{
if(m.isPlaying())
{
}
else
{
m.stop();
m.release();
}
}
我有 24 个按钮,我正在尝试获得一个可以运行所有功能的应用程序,而无需重新启动应用程序谢谢 :)
解决方案
问题在于以这种方式反复使用 MediaPlayer 可能会产生误导:
SonDeadliest = MediaPlayer.create(getApplicationContext(),R.raw.themostdeadliestganginuganda); SonDeadliest.start();
它会消耗不必要的资源。为了更好地理解,我建议您阅读这篇文章。它是使用 Kotlin 编写的,但通过一点 kotlin 学习你就可以理解。
这是Java中的一个实现,尝试使用您的场景:
MediaPlayer myMediaPlayer;
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//Media Player setup
myMediaPlayer = new MediaPlayer();
myMediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
myMediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
mp.reset();
}
});
//Buttons
Button button1 = view.findViewById(R.id.button_record1);
button1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
playSound(R.raw.record1);
}
});
Button button2 = view.findViewById(R.id.button_record2);
button2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
playSound(R.raw.record2);
}
});
}
void playSound(int rawResId) {
try {
AssetFileDescriptor afd = getContext().getResources().openRawResourceFd(rawResId);
if (afd != null) {
myMediaPlayer.reset();
myMediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
myMediaPlayer.prepareAsync();
}
} catch (Exception ex) {
Log.d("MediaPLayer", "playSound exception: " + ex.getMessage());
}
}
代码可以改进,但我的目的只是为了便于理解。为了简化,我只使用了 2 个按钮。但我建议您考虑使用更好的解决方案,而不是为 24 个按钮中的每一个都创建一个侦听器。(查看 DataBinding,将资源作为参考传递)。
推荐阅读
- reactjs - 在 ReactJS 中,我如何跟踪一组复选框的状态?
- sql - 如果结果保持不变,如何获取最小日期和最大日期
- javascript - 添加动态创建的 web 元素的事件监听器
- javascript - 解决 VueJS 构建和 html-minifiy 的问题
- r - 自动填充 R 中不规则日期戳的缺失日期
- android - 错误 android-emu/android/qt/qt_setup.cpp:28:Qt library not found at ..\emulator\lib64\qt\lib 无法启动 'C:\Users: 没有这样的文件或目录
- python - Python中具有嵌套函数的二分搜索的递归方式
- android - 是否可以创建注释来检查用户是否经过身份验证?科特林
- c# - 如何获取静态对象 C# 的哈希码?
- spring-boot - @Retryable 方法不起作用,这也是 @Scheduled 和 @EnableSchedulerLock