Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.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 为什么';t完成();结束一个Mediaplayer?_Android - Fatal编程技术网

Android 为什么';t完成();结束一个Mediaplayer?

Android 为什么';t完成();结束一个Mediaplayer?,android,Android,为什么不呢 根据我的理解,finish()会破坏整个活动,因此它也会破坏正在运行的媒体播放器 这是我的密码: MediaPlayer ourSong; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.splash); ourSong = MediaPlayer.create(

为什么不呢

根据我的理解,finish()会破坏整个活动,因此它也会破坏正在运行的媒体播放器

这是我的密码:

MediaPlayer ourSong;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);
    ourSong = MediaPlayer.create(this, R.raw.hungat);
    ourSong.start();
    Thread timer = new Thread() {
        @Override
        public void run() {
            try {
                sleep(5000);

            } catch (InterruptedException e){
                e.printStackTrace();
            }finally {
                Intent i1 = new Intent("android.intent.action.MAINACTIVITY");
                startActivity(i1);
            }
        }
    };
    timer.start();
}
@Override
protected void onPause() {
    super.onPause();
    finish();
}
}

当您调用
finish()
时,在将控件返回到Android之前,它不会运行。 由于您没有停止
MediaPlayer
实例,因此不会传递控件

在完成活动之前停止并释放它,并包括
onDestroy()
,以便在活动关闭时正确处置它

有关更多信息,请查看官方网站

当您调用
finish()
时,在将控件返回到Android之前,它不会运行。 由于您没有停止
MediaPlayer
实例,因此不会传递控件

在完成活动之前停止并释放它,并包括
onDestroy()
,以便在活动关闭时正确处置它

有关更多信息,请查看官方网站


MediaPlayer
未连接到该活动,并且不知道该活动正在被销毁。因此,
MediaPlayer
不受被销毁活动的影响,并继续执行您让它执行的任何操作

在某种程度上,这是因为
MediaPlayer
不需要活动——很多时候,
MediaPlayer
是由服务管理的,因为媒体播放应该独立于用户对UI的操作进行


当活动被销毁时,欢迎您安排自己停止
MediaPlayer
——正如其他人所指出的,
stop()
release()
onDestroy()
中停止
MediaPlayer
。但是,您必须自己做,否则
MediaPlayer
无法知道它应该停止。

MediaPlayer
未连接到该活动,并且不知道该活动正在被销毁。因此,
MediaPlayer
不受被销毁活动的影响,并继续执行您让它执行的任何操作

在某种程度上,这是因为
MediaPlayer
不需要活动——很多时候,
MediaPlayer
是由服务管理的,因为媒体播放应该独立于用户对UI的操作进行


当活动被销毁时,欢迎您安排自己停止
MediaPlayer
——正如其他人所指出的,
stop()
release()
onDestroy()
中停止
MediaPlayer
。但是,您必须自己做,否则,
MediaPlayer
无法知道它应该停止。

因为它是一个线程

使用这个
runnable.terminate(); thread.join()


请参阅此

,因为它是一个线程

使用这个
runnable.terminate(); thread.join()


请参阅此

,因为您应该在MediaPlayer上调用stop(),而不是依赖GC。因为您应该在MediaPlayer上调用stop(),而不是依赖GC。也许……请再次编辑您的答案,并用我们的歌曲替换MediaPlayer……您的代码没有使用提供的示例编译为什么必须使用stop和release?你不能只使用release吗?@primacontonie从技术上讲,你不需要在发布前调用stop,API声明可以在
任何
状态下调用release。也许…再次编辑你的答案并用我们的歌曲替换mediaPlayer…你的代码不使用提供的示例编译为什么你必须使用stop和release?你不能只使用release吗?@primacontonie从技术上讲,你不需要在发布之前调用stop,API声明可以在
任何
状态下调用release。谢谢。这就是我一直在寻找的答案。我不知道这不是活动的一部分。谢谢。这就是我一直在寻找的答案。我不知道这不是活动的一部分。
MediaPlayer ourSong;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);
    ourSong = MediaPlayer.create(this, R.raw.hungat);
    ourSong.start();

    Thread timer = new Thread() {
        @Override
        public void run() {
            try {
                sleep(5000);
            } catch (InterruptedException e){
                e.printStackTrace();
                destroyMediaPlayer();
            }finally {
                Intent i1 = new Intent("android.intent.action.MAINACTIVITY");
                startActivity(i1);
            }
        }
    };
    timer.start();
}

@Override
protected void onPause() {
    super.onPause();
    destroyMediaPlayer();
    finish();
}

@Override
protected void onDestroy() {
    super.onPause();
    destroyMediaPlayer();
    finish();
}

private void destroyMediaPlayer(){
    if(ourSong != null){
      ourSong.stop();
      ourSong.release();
    }
}