Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.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 我的程序在按下播放按钮后停止响应_Java_Android - Fatal编程技术网

Java 我的程序在按下播放按钮后停止响应

Java 我的程序在按下播放按钮后停止响应,java,android,Java,Android,所以我创建了一个带有播放和停止按钮的小应用程序。当我按下播放按钮时,它应该循环直到我按下停止按钮。问题是,一旦我按下播放按钮,我就不能做任何其他事情,停止按钮也没有响应。如果我尝试按下停止按钮,我的应用程序会显示应用程序没有响应并退出。我不知道为什么会发生这种情况,而且我对Android和Java非常陌生,所以要知道为什么它不工作对我来说有点复杂。这是我的实际代码: 播放和停止方法: public void play() { playing = true; while (p

所以我创建了一个带有播放和停止按钮的小应用程序。当我按下播放按钮时,它应该循环直到我按下停止按钮。问题是,一旦我按下播放按钮,我就不能做任何其他事情,停止按钮也没有响应。如果我尝试按下停止按钮,我的应用程序会显示应用程序没有响应并退出。我不知道为什么会发生这种情况,而且我对Android和Java非常陌生,所以要知道为什么它不工作对我来说有点复杂。这是我的实际代码:

播放和停止方法:

   public void play() {
    playing = true;
    while (playing) {
        for (int i = 0; i < 4; i++) {
            if (buttonArray[i].isChecked()) {
                sp.play(snareId, 1, 1, 1, 0, 1);
            }
            if (!playing) {
                break;
            }
            try {
                Thread.sleep(1000);
                if(i == 3) i = -1;

            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

public void stop(){

    playing = false;//
}
根据Android,诊断ANR时需要寻找一些常见模式:

  • 应用程序正在主线程上执行涉及I/O的缓慢操作
  • 应用程序正在主线程上进行长时间计算
  • 主线程正在对另一个线程执行同步绑定器调用 过程,而另一个过程需要很长时间才能返回

    等等

  • 您处于第二种情况,因为您在主线程(本例中是UI线程)中(播放)时创建了一个无限循环
    。只需聆听复选框中的更改,然后分别完成任务

    public void play(){
       //call startService to play sound
       //for each toggle button
       buttonArray[i].setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
              if (isChecked) {
                //do your tasks
              } else {
                //do your tasks
              }
           }
       });
    }
    
    public void stop(){
        //call stopService to play sound
        //for each toogle button:
        buttonArray[i].setOnCheckedChangeListener(null);
    }
    

    调试时是否检查了异常e值?它应该为您提供与错误相关的信息。异常e似乎给了我这些错误:“线程[3,tid=10357,WaitingMainSignalCatcherLoop,线程*=0xee65dc00,对等方=0x16000020,“信号捕捉器”]:对信号3作出反应”和“将堆栈跟踪写入“[tombstoned]”但是我添加了一个条件,我可以手动停止无限循环,这还不够吗?。如何在保持无限循环的同时解决此问题?buttonArray[I]复选框吗?它们是选中或不选中的切换按钮。感谢您的帮助。所以我尝试了你的解决方案,但你的解决方案中的问题是,声音只在我按下切换按钮时播放,但我的目标是只在我按下播放按钮时播放声音。似乎播放和停止按钮在您的解决方案中变得无关紧要。@MichelPinto要播放声音,您应该使用
    服务
    public void play(){
       //call startService to play sound
       //for each toggle button
       buttonArray[i].setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
              if (isChecked) {
                //do your tasks
              } else {
                //do your tasks
              }
           }
       });
    }
    
    public void stop(){
        //call stopService to play sound
        //for each toogle button:
        buttonArray[i].setOnCheckedChangeListener(null);
    }