C# 为什么Android MediaPlayer只玩一次,如果我没有在循环中声明它?
我有一个循环,它获取一个输入流,将其写入一个临时文件,并在每个循环上将android MediaPlayer setdatasource设置为该文件。如果我在循环内声明它,它将播放,但是如果它在循环外,它将只播放一次C# 为什么Android MediaPlayer只玩一次,如果我没有在循环中声明它?,c#,xamarin.forms,android-mediaplayer,C#,Xamarin.forms,Android Mediaplayer,我有一个循环,它获取一个输入流,将其写入一个临时文件,并在每个循环上将android MediaPlayer setdatasource设置为该文件。如果我在循环内声明它,它将播放,但是如果它在循环外,它将只播放一次 Java.IO.File temp = Java.IO.File.CreateTempFile("temp", "mp3"); Java.IO.FileInputStream fis = new Java.IO.FileInputStream(temp); temp.DeleteO
Java.IO.File temp = Java.IO.File.CreateTempFile("temp", "mp3");
Java.IO.FileInputStream fis = new Java.IO.FileInputStream(temp);
temp.DeleteOnExit();
MediaPlayer player = new MediaPlayer();
while (true)
{
try
{
byte[] myReadBuffer = new byte[10000];
Java.IO.FileOutputStream fos = new Java.IO.FileOutputStream(temp);
mmInStream.Read(myReadBuffer, 0, myReadBuffer.Length);
fos.Write(myReadBuffer, 0, myReadBuffer.Length);
player.SetDataSource(fis.FD);
player.Prepare();
player.Start();
while (true)
{
if (!player.IsPlaying)
{
player.Reset();
break;
}
}
}
catch (System.IO.IOException ex)
{
System.Diagnostics.Debug.WriteLine("Input stream was disconnected", ex);
}
}
您可以实现可以看到的IDisposable,这将删除混乱的while循环。或者,您最好只使用您已经有权访问的完成事件处理程序,如您所见:
另外,下次请尽量弄清楚,因为你有两个循环,而且你没有提到你所说的是哪个循环每次使用后你都没有进行任何清理-在重用itI之前尝试调用Release()和Reset(),我确实尝试在播放结束后释放播放器/尝试在2中重置,而loop尝试了此操作,但是,如果我在每个循环中重新创建MediaPlayer,它将跳过部分音乐,但如果我将其放在第一个循环之外,它将只播放一次。根据android版本或设备制造商,行为是否会发生变化?在仿真器和实际设备上的行为也一样吗?它不会改变,在模拟设备上和实际设备上也是一样的。您是否查看了我共享的示例?您还可以在所有github开放式repo上搜索C代码中的“new MediaPlayer();”
player.Completion += (s, e) =>
{
// Do work
}