Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/229.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
Android使用SurfaceView和Android media player播放视频会导致用户界面阻塞_Android_Media Player_Surfaceview - Fatal编程技术网

Android使用SurfaceView和Android media player播放视频会导致用户界面阻塞

Android使用SurfaceView和Android media player播放视频会导致用户界面阻塞,android,media-player,surfaceview,Android,Media Player,Surfaceview,嗨,我正在开发android应用程序,我想在其中播放视频使用URI作为源。所以我的问题场景是这样的,我有两个活动。从一个活动开始,我开始另一个活动,我在其中播放我的视频。所以问题是这样的,当我开始我的视频播放器活动时,如果我在“准备获取执行”之前单击“上一步”,它将关闭播放器活动,但我以前的活动并没有响应。我检查了我的日志记录,它表明尽管它关闭了我的玩家活动;这不是毁灭。延迟一段时间后,它将执行ondestroy。一旦执行了“为玩家销毁”活动,则只有我的活动响应。所以我的两个活动生命周期日志看起

嗨,我正在开发android应用程序,我想在其中播放视频使用URI作为源。所以我的问题场景是这样的,我有两个活动。从一个活动开始,我开始另一个活动,我在其中播放我的视频。所以问题是这样的,当我开始我的视频播放器活动时,如果我在“准备获取执行”之前单击“上一步”,它将关闭播放器活动,但我以前的活动并没有响应。我检查了我的日志记录,它表明尽管它关闭了我的玩家活动;这不是毁灭。延迟一段时间后,它将执行ondestroy。一旦执行了“为玩家销毁”活动,则只有我的活动响应。所以我的两个活动生命周期日志看起来像

inside on pause of activity A
inside on create of player activity
inside on surface change 
inside on destroy of of activity A
inside on create of activity A
inside on resume of activity A
inside on stop of player activity     // delay occured here ...
inside on destroy of player activity  // delay occured here ... 
我的播放器代码如下所示:

private class PeparePlayer extends AsyncTask<Void, Void, Void> 
{    
    @Override
    protected Void doInBackground(Void... params) {
         try {
             mediaPlayer.setDataSource(getApplicationContext(), targetUri);
             mediaPlayer.prepareAsync();
             //mediaPlayer.prepare();    
         } catch (IllegalArgumentException e) {
             e.printStackTrace();
         } catch (IllegalStateException e) {
             e.printStackTrace();
         } catch (IOException e) {
             e.printStackTrace();
         }

         mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
            @Override
            public void onPrepared(MediaPlayer mp) {
                // TODO Auto-generated method stub
                Log.i("MJKMJKMJKMJKMJKMJKMJKMJK", "MJKMJKMJKMJKMJKMJKMJKMJK inside on prepare listener ");
                mediaPlayer.start();
            }
            });
        return null;
    }

@Override
protected void onPreExecute() {}

@Override
protected void onProgressUpdate(Void... values) {}
}
私有类PeparePlayer扩展异步任务
{    
@凌驾
受保护的Void doInBackground(Void…参数){
试一试{
setDataSource(getApplicationContext(),targetUri);
mediaPlayer.prepareAsync();
//mediaPlayer.prepare();
}捕获(IllegalArgumentException e){
e、 printStackTrace();
}捕获(非法状态){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
mediaPlayer.setOnPreparedListener(新的mediaPlayer.OnPreparedListener(){
@凌驾
已准备好公开作废(MediaPlayer mp){
//TODO自动生成的方法存根
Log.i(“MJKMJKMJKMJKMJKMJKMJKMJKMJKMJKMJKMJKMJKMJKMJKMJKMJKMJK”,“MJKKMJKMJKMJKMJKMKMJKMKMJKMJKM;
mediaPlayer.start();
}
});
返回null;
}
@凌驾
受保护的void onPreExecute(){}
@凌驾
受保护的void onProgressUpdate(void…值){}
}

一旦它在prepare上执行,然后单击back,它就可以正常工作了。但是,如果我在onprepare完成之前单击back,就会导致UI阻塞问题。我做错什么了吗?我需要一些帮助。谢谢。

您不需要将其包装在异步类中,prepare async应将其作为后台任务处理。试着在正常的线程中准备它,看看会发生什么。谢谢你的回放。我在多台设备上进行了测试,只在谷歌nexus和平板电脑等谷歌设备上遇到了这个问题。在其他设备上,其工作正常。我不知道这有什么问题。长期以来一直在努力解决这个问题。如果你知道一些关于这个问题的事情,请让我知道如何解决这个问题。