Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么Android MediaPlayer只玩一次,如果我没有在循环中声明它?_C#_Xamarin.forms_Android Mediaplayer - Fatal编程技术网

C# 为什么Android MediaPlayer只玩一次,如果我没有在循环中声明它?

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

我有一个循环,它获取一个输入流,将其写入一个临时文件,并在每个循环上将android MediaPlayer setdatasource设置为该文件。如果我在循环内声明它,它将播放,但是如果它在循环外,它将只播放一次

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
}