【问题标题】:Issue with Breaking a Method Android破坏方法Android的问题
【发布时间】:2023-11-11 21:30:01
【问题描述】:

下面的代码不会破坏方法或循环,而是永远循环播放音乐。当(n==maxCount) 它应该改变n=1 的值并从OnCompletionListener 出来,即,音乐应该停止播放,这就是我想要的。

我该如何解决这个问题?

    protected void playsound() {
    mp.setOnCompletionListener(new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            if (n<=maxCount) {
                mp.start();
                n++;
                if(n==maxCount){
                    n=1;
                    return;
                }
            }
        }
    });
    mp.start();

maxCount 值取决于 Spinner 值,n=1 是全局声明的。

下面是它完美运行的更正代码,下面的代码有什么错误吗?因为一些用户说“使用此代码,您将面临丢失退出条件的危险,因为如果您输入时 n == maxCount,则在您 n++ 之后 n > maxCount。简而言之,它会一直运行直到您达到 maxint,然后它会崩溃” ?

protected void playsound() {
    // TODO Auto-generated method stub
    mp.setOnCompletionListener(new OnCompletionListener() {
        @Override
        public void onCompletion(MediaPlayer mp) {
            if (n<=maxCount) {
                mp.start();
                n++;
                if(n==maxCount){
                    n=1;
                    mp.pause();
                    mp.seekTo(0);

                }
            }
        }
    });
    mp.start();
}

【问题讨论】:

  • maxcout的初始值是多少
  • maxcout 的初始值 = 2。
  • 使用最新的编辑,您将面临错过退出条件的危险,因为如果您输入时n == maxCount,那么n &gt; maxCount 在您之后n++。简而言之,它会一直运行到你点击maxint,然后它会崩溃。

标签: android loops methods media-player break


【解决方案1】:

编辑:

你不能用mp.start();停止音乐,你需要使用mp.stop()来代替


你正在检查if (n&lt;maxCount) {

在相同的条件下,您正在检查n==maxCount,世界上的值如何小于等于该数字的数字,即n==maxCount 永远不会满足 所以你需要像这样改变条件

if(n<=maxCount)

下面的代码不会破坏方法或循环,而是永远循环播放音乐

是的,因为您的 return 语句永远不会满足 n==maxCount

【讨论】:

  • 平心而论:OP 在两个条件之间递增n。因此,如果maxCount == (n-1) 在第一个条件下,它会在第二个条件下是maxCount == n
  • @MH。他编辑了他的问题......并改变了条件,检查他最近的编辑 1 分钟前
  • @SaiKiran 如果你想停止音乐,那么你需要调用 mp.stop() 而不是 mp.start(),因为你每次都调用 mp.start() 以便音乐播放不停止
  • @Pragnani 我删除了return; 并添加了mp.pause(); mp.seekTo(0); 它运行良好,可以吗?并且@323go 说“使用最新的编辑,您可能会错过退出条件,因为如果您输入时 n == maxCount,那么在您 n++ 之后 n > maxCount。简而言之,它会一直运行到您达到 maxint,然后它会崩溃。”他的意思是什么?
  • @SaiKiran 他的意思是,如果你的程序中的其他地方以某种方式将 n 设置为 maxCount,那么 n&lt;=maxCount 将为真,n 将设置为 maxCount+1,然后 n==maxCount 将为假,因此 n 永远不会被设置回 1,n==maxCount 永远不会为真。您可以将 n==maxCount 更改为 n&gt;=maxCount,这将确保 n 在需要时始终设置回 1
【解决方案2】:

问题在于你在哪里运行mp.start()。像这样将它移动到其他地方:

if (n<maxCount) {
    n++;
    if(n==maxCount){
        // Don't play the sound anymore.
        n=1;
        return;
    } else {
        // Continue playing the sound.
        mp.start();
    }
}

您遇到的问题是您检查了if(n==maxCount),但是您以任何一种方式播放声音,然后您将 n 重置为 1,以便它继续播放。

【讨论】:

    【解决方案3】:

    我认为您需要将mp.start() 放在内部 if 之后。由于您每次都开始播放音乐,它总是会回到onCompletion,即使在播放完maxCount之后也可以再次开始播放,因为您正在设置n=1;

        public void onCompletion(MediaPlayer mp) {
            if (n < maxCount) {
                n++;
                if(n == maxCount){
                    n = 1;
                    return;
                }
                mp.start();
            }
        }
    

    【讨论】: