Java 如何在android studio中通过单击结束循环
我是android编程新手。我正在开发一个应用程序,当按下按钮时会使手电筒闪烁,当再次按下按钮时会将其关闭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
@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}),而是使用一些定时触发器。例如,计划执行者或计时器…谢谢。。。我试试看