Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.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
Java 媒体播放器绑定服务在暂停线程时锁定UI_Java_Android_Service_Media Player - Fatal编程技术网

Java 媒体播放器绑定服务在暂停线程时锁定UI

Java 媒体播放器绑定服务在暂停线程时锁定UI,java,android,service,media-player,Java,Android,Service,Media Player,我知道暂停线程很容易锁定UI,这通常是个坏主意。然而,我的理解是,如果某个东西作为服务运行,将不会导致任何问题,因为该服务将暂停,主应用程序将继续运行 考虑到这一点,我不是做错了什么,就是误解了MediaPlayer对服务的使用 我创建对象 public AudioService AudioService; public boolean AudioServiceBound = false; 然后在我的SurfaceView的onStart事件中绑定它: public void onStart(

我知道暂停线程很容易锁定UI,这通常是个坏主意。然而,我的理解是,如果某个东西作为服务运行,将不会导致任何问题,因为该服务将暂停,主应用程序将继续运行

考虑到这一点,我不是做错了什么,就是误解了MediaPlayer对服务的使用

我创建对象

public AudioService AudioService;
public boolean AudioServiceBound = false;
然后在我的SurfaceView的onStart事件中绑定它:

public void onStart() {
    Intent intent = new Intent(gameContext, AudioService.class);
    gameContext.bindService(intent, myConnection, Context.BIND_AUTO_CREATE);
}
在剩下的课程中,我运行基于onResume和onPause事件暂停和恢复音频服务的方法

我试图在我的服务中引入一种新的能力。在我的主更新循环中,我运行函数
half-overswitch()
,如下所示:

public void HalfOverSwitch()
{
    if (( ((float)player.getCurrentPosition()) / ((float)player.getDuration()) > 0.5) && !transitioning)
    {
        transitioning = true;

        MediaPlayer temp = MediaPlayer.create(this, R.raw.dumped);
        temp.setVolume(0, 0);
        temp.setLooping(true);
        temp.start();

        for (int i = 0; i < 100; i++)
        {
            player.setVolume(100-i, 100-i);
            temp.setVolume(i, i);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
        player = temp;
        player.setVolume(100,100);

        transitioning = false;
    }
}
public void半切换开关()
{
如果(((float)player.getCurrentPosition())/((float)player.getDuration())>0.5)和转换)
{
转换=真;
MediaPlayer temp=MediaPlayer.create(此为R.raw.dumped);
温度设定体积(0,0);
温度设置循环(真);
临时启动();
对于(int i=0;i<100;i++)
{
player.setVolume(100-i,100-i);
温度设定体积(i,i);
试一试{
睡眠(100);
}捕捉(中断异常e){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
玩家=临时工;
播放器设置音量(100100);
转换=假;
}
}

因为该函数不返回任何内容,并且运行在不同的线程中,所以据我所知,主活动不会暂停。然而,确实如此。这就引出了一个问题,做这样的事情的最佳方式是什么,让我的音频服务成为一项服务(而不仅仅是一个类)有什么意义呢?服务在创建服务的同一线程中运行


请注意,与其他应用程序对象一样,服务在其宿主进程的主线程中运行。这意味着,如果您的服务要执行任何CPU密集型(如MP3播放)或阻塞(如网络)操作,它应该生成自己的线程来执行该操作

相比于只创建一个类实例而忽略所有绑定,这有什么好处?好的,根据您的编辑,我应该让服务在后台播放音乐?据我所知,MediaPlayer对象已经做到了这一点。基于我只有一项活动这一事实,似乎完全不使用服务会更容易。我看不出有什么好处。当您按back键或主屏幕活动暂停时,服务仍在后台运行。您可以在其中执行重要任务。如果服务只播放音乐,那么如果我设计正确,它应该会自动暂停。服务有什么好处吗?请阅读本文。