Android MediaPlayer setDataSource将阻塞,直到另一个MediaPlayer实例完成准备

Android MediaPlayer setDataSource将阻塞,直到另一个MediaPlayer实例完成准备,android,media-player,blocking,Android,Media Player,Blocking,我有一个MediaPlayer实例正在准备网络流。当它还在准备时,我正在分配另一个MediaPlayer实例,并尝试将数据源设置为本地文件。setDataSource方法阻塞,直到第一个MediaPlayer实例完成准备。我只使用模拟器进行了测试。你知道为什么会这样吗?据我所知,这两个MediaPlayer实例应该独立运行。 多谢各位 我在我的应用程序之外创建了一个小测试。这是我的onCreate方法的代码: @Override public void onCreate(Bundle saved

我有一个MediaPlayer实例正在准备网络流。当它还在准备时,我正在分配另一个MediaPlayer实例,并尝试将数据源设置为本地文件。setDataSource方法阻塞,直到第一个MediaPlayer实例完成准备。我只使用模拟器进行了测试。你知道为什么会这样吗?据我所知,这两个MediaPlayer实例应该独立运行。 多谢各位

我在我的应用程序之外创建了一个小测试。这是我的onCreate方法的代码:

@Override
public void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    Button b = (Button)findViewById(R.id.thebutton);
    b.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
            System.out.println("555555555555555");
            MediaPlayer pl2 = new MediaPlayer();
            System.out.println("6666666666666");
            try {
                pl2.setDataSource("/mnt/sdcard/Music/ABBA/Abba - Waterloo.mp3");
                System.out.println("777777777777");
                pl2.prepareAsync();
                System.out.println("888888888888");
            } catch (IOException e) {
                e.printStackTrace();
            }

        }
    });

    System.out.println("111111111111");
    MediaPlayer pl1 = new MediaPlayer();
    System.out.println("22222222222222");
    try {
        pl1.setDataSource("http://glb-stream14.streamserver.ch/1/rsc_it/aacp_64");
        System.out.println("3333333333333");
        pl1.prepareAsync();
        System.out.println("444444444444");
    } catch (IOException e) {
        e.printStackTrace();
    }
}
这是日志输出:

12-28 14:59:57.478: INFO/ActivityManager(59): Starting activity: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] flg=0x10200000 cmp=net.selfip.imiklosik.tests/.MyActivity bnds=[2,155][58,214] }<br/>
12-28 14:59:57.707: INFO/System.out(342): 111111111111<br/>
12-28 14:59:57.737: INFO/System.out(342): 22222222222222<br/>
12-28 14:59:57.747: INFO/StagefrightPlayer(34): setDataSource('http://glb-stream14.streamserver.ch/1/rsc_it/aacp_64')<br/>
12-28 14:59:57.747: INFO/System.out(342): 3333333333333<br/>
12-28 14:59:57.787: INFO/System.out(342): 444444444444<br/>
12-28 14:59:58.048: INFO/ActivityManager(59): Displayed activity net.selfip.imiklosik.tests/.MyActivity: 426 ms (total 426 ms)<br/>
12-28 15:00:05.338: INFO/System.out(342): 555555555555555<br/>
**12-28 15:00:05.338**: INFO/System.out(342): 6666666666666<br/>
**12-28 15:00:18.449**: INFO/StagefrightPlayer(34): setDataSource('/mnt/sdcard/Music/ABBA/Abba - Waterloo.mp3')<br/>
12-28 15:00:18.449: INFO/System.out(342): 777777777777<br/>
12-28 15:00:18.449: INFO/System.out(342): 888888888888<br/>
12-28 15:00:18.467: ERROR/MediaPlayer(342): error (1, -2147483648)<br/>
12-28 15:00:18.498: ERROR/MediaPlayer(342): Error (1,-2147483648)<br/>
12-28 14:59:57.478:INFO/ActivityManager(59):开始活动:Intent{act=android.Intent.action.MAIN cat=[android.Intent.category.LAUNCHER]flg=0x10200000cmp=net.selfip.imiklosik.tests/.MyActivity bnds=[2155][58214]}
12-2814:59:57.707:信息/系统输出(342):111111
12-2814:59:57.737:信息/系统输出(342):22222
12-28 14:59:57.747:INFO/StagefrightPlayer(34):setDataSource('http://glb-stream14.streamserver.ch/1/rsc_it/aacp_64)
12-28 14:59:57.747:信息/系统输出(342):3333
12-2814:59:57.787:信息/系统输出(342):4444
12-28 14:59:58.048:INFO/ActivityManager(59):显示的活动net.selfip.imiklosik.tests/.MyActivity:426毫秒(总计426毫秒)
12-28 15:00:05.338:信息/系统输出(342):555
**12-28 15:00:05.338**:信息/系统输出(342):666
**12-28 15:00:18.449**:INFO/StagefrightPlayer(34):setDataSource('/mnt/sdcard/Music/ABBA/ABBA-Waterloo.mp3')
12-28 15:00:18.449:信息/系统输出(342):7777
12-28 15:00:18.449:信息/系统输出(342):8888888
12-28 15:00:18.467:错误/媒体播放器(342):错误(1,-2147483648)
12-28 15:00:18.498:错误/媒体播放器(342):错误(1,-2147483648)
第一个粗体时间戳是在我按下按钮之后(就在第二个player对象上的setDataSource调用之前)。
第二个粗体时间戳在setDataSource方法完成之后。
有13秒的差异,即setDataSource方法(在完全不同的MediaPlayer对象上调用,而第一个MediaPlayer对象正在准备-即使使用prepareAsync)被阻止的时间。

为什么会这样?我做错什么了吗?

与第一个从网络获取流的媒体一起使用,因为使用
prepare()
会阻塞您的UI线程,因此第二个MediaPlayer将等待第一个媒体播放器完成准备。

我刚刚发现如果我使用另一个网络url(http://listen.radionomy.com/radio-mozart)这是一个mp3流问题消失了。setDataSource不再阻塞。原始url是API8 MediaPlayer不支持的aac流。但我认为,在另一个MediaPlayer上调用的setDataSource方法不应该阻塞。这是安卓的bug吗?现在,当setDataSource阻塞时,我必须解决这种情况。

您在代码中应用了我的答案,然后用另一个错误编辑问题,每个人都将使用我的答案。。为什么!!!我真的不明白你在这里的意思。还有什么错误?这就是我前面提到的错误(setDataSource阻塞,直到第一次准备结束)。我没有“应用”你的答案,因为在我的程序中我已经使用了prepareAsync方法。是真的,我忘了说了。此外,如果我以前使用过prepare,那么我就不能再次调用setDatasource,因为UI会被阻塞。也许只是来自另一个线程,但这样就不会有任何阻塞。请说清楚一点。对不起,现在我明白你的意思了。但还有什么选择呢?我发布新代码的唯一方法就是编辑我的问题。我不打算奉献。