Java 如何在android studio中通过单击结束循环

Java 如何在android studio中通过单击结束循环,java,android,Java,Android,我是android编程新手。我正在开发一个应用程序,当按下按钮时会使手电筒闪烁,当再次按下按钮时会将其关闭 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); camera = Camera.open(); //opening camera har

我是android编程新手。我正在开发一个应用程序,当按下按钮时会使手电筒闪烁,当再次按下按钮时会将其关闭

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    camera = Camera.open(); //opening camera hardware
    params = camera.getParameters(); //getting parameters

    //finding elements
    final Button btn = (Button) findViewById(R.id.btn);
    //accessed within inner class at onClick , so it must be declared final

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(isOn){
                params.setFlashMode(Parameters.FLASH_MODE_OFF);
                camera.setParameters(params);
                isOn=false;
                btn.setBackgroundResource(R.drawable.btnoff);
            } else {
                while(!isOn) {
                    params.setFlashMode(Parameters.FLASH_MODE_TORCH);
                    camera.setParameters(params);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    params.setFlashMode(Parameters.FLASH_MODE_OFF);
                    camera.setParameters(params);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                btn.setBackgroundResource(R.drawable.btnon);
                isOn=true;
            }
        }
    });
}
目前,我被困在一个无限循环中,无法理解如何在再次按下按钮时给它一个结束循环的命令

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    camera = Camera.open(); //opening camera hardware
    params = camera.getParameters(); //getting parameters

    //finding elements
    final Button btn = (Button) findViewById(R.id.btn);
    //accessed within inner class at onClick , so it must be declared final

    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(isOn){
                params.setFlashMode(Parameters.FLASH_MODE_OFF);
                camera.setParameters(params);
                isOn=false;
                btn.setBackgroundResource(R.drawable.btnoff);
            } else {
                while(!isOn) {
                    params.setFlashMode(Parameters.FLASH_MODE_TORCH);
                    camera.setParameters(params);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    params.setFlashMode(Parameters.FLASH_MODE_OFF);
                    camera.setParameters(params);
                    try {
                        Thread.sleep(500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                btn.setBackgroundResource(R.drawable.btnon);
                isOn=true;
            }
        }
    });
}

您所做的是在主线程中运行进程(循环),这会导致UI被阻塞。您必须记住,不能在android中阻止UI

因此,您需要做的是为您的操作创建另一个线程。您可以使用或任何您知道的多线程方法来完成


将会发生的是,在您的
onClickListener
中,您将只设置
isOn
的值。进程(if else语句中的其他内容)必须在另一个线程上实现。

您所做的是在主线程中运行进程(循环),这会导致UI被阻塞。您必须记住,不能在android中阻止UI

因此,您需要做的是为您的操作创建另一个线程。您可以使用或任何您知道的多线程方法来完成


将会发生的是,在您的
onClickListener
中,您将只设置
isOn
的值。进程(if-else语句中的其他内容)必须在另一个线程上实现。

由于摄影机灯打开和关闭逻辑太长,无法填充事件处理程序,因此应将它们放在事件处理程序之外以保持干净

 btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(isOn){
               turnOff();
            } else {
               turnOn();
            }
    }  

      private void turnOn() {
        // ... logic on turn on
        isOn = true;
      }

      private void turnOff() {
        // ...logic on turn off
        isOn = false;
      }

请参阅有关如何以编程方式打开和关闭摄像头指示灯的帖子。

由于摄像头指示灯打开和关闭逻辑太长,无法填充事件处理程序,因此应将其放在事件处理程序之外以保持干净

 btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(isOn){
               turnOff();
            } else {
               turnOn();
            }
    }  

      private void turnOn() {
        // ... logic on turn on
        isOn = true;
      }

      private void turnOff() {
        // ...logic on turn off
        isOn = false;
      }

请参阅有关如何以编程方式打开和关闭摄像头指示灯的帖子。

您的代码是否应为:

isOn = true;
while(isOn) {
    // some code
}
而不是:

while(!isOn) {
    // some code
}
isOn = true;

您的代码不应该是:

isOn = true;
while(isOn) {
    // some code
}
而不是:

while(!isOn) {
    // some code
}
isOn = true;

另一个改进是不使用自旋等待(while{Thread.Sleep}),而是使用一些定时触发器。例如,计划执行者或计时器…谢谢。。。我将尝试另一个改进,即不使用自旋等待(while{Thread.Sleep}),而是使用一些定时触发器。例如,计划执行者或计时器…谢谢。。。我试试看