[英]How to exit an infinite while loop when user taps screen?
我目前有一个while循环,当用户点击屏幕时开始。 该循环是无限的,当它感测到用户再次敲击屏幕时应停止。 (而且,如果再次点击它,它将再次开始循环,依此类推。)我试图以两种不同的方式打破循环,但两种方式均产生不令人满意的结果:
方法1:当我尝试这种方法时,发生的事情是用户点击,循环开始。 用户再次点击,该点击不会被注册,循环继续进行。
boolean playing = false;
@Override
public boolean onTouch(View v, MotionEvent event)
{
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
if(!playing)
{
playing = true;
while(playing)
{
//do something here
}
}
else if(playing)
{
playing = false;
}
}
return false;
}
方法2:当我尝试这种方法时,发生的事情是用户轻击,循环开始,经历一次迭代,然后停止。
boolean playing = false;
@Override
public boolean onTouch(View v, MotionEvent event)
{
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
if(!playing)
{
playing = true;
whileLoop:
while(playing)
{
//do something here
}
}
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
playing = false;
break whileLoop;
}
}
return false;
}
我看过这些问题,但都没有帮助我解决我的具体情况:
那么如何实现while循环呢? 我只想要一个简单的界面,用户点击即可切换while循环的开/关。
将无限循环放在Thread
。 在此放置它,您只需在其中包含一个控制变量(如playing
),然后再次轻playing
而要停止,只需将其设置为false即可。 并行运行的Thread
将能够处理两个事件(水龙头和Thread止动件)。
----编辑----
添加示例:
// You'd probably need to store this variable class-wide,
// so you can control when the user has tapped for the first or second time
boolean playing = false;
@Override
public boolean onTouch(View v, MotionEvent event)
{
if(event.getAction() == MotionEvent.ACTION_DOWN)
{
if(!playing)
{
playing = true;
new Thread(
new Runnable() {
public void run() {
while(playing)
{
//do something here
}
}
}
).start();
}
else if(playing)
{
playing = false;
// As you're controlling the playing value in the Thread,
// setting it here to false would mean that your thread stops too.
}
}
return false;
}
尝试这个:
boolean playing = false;
Handler handler = new Handler();
Runnable runner = new Runnable() {
@Override
public void run() {
// do something here
handler.post(this);
}
};
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
if(!playing) {
playing = true;
runner.run();
return true;
}
if(playing) {
playing = false;
handler.removeCallbacks(runner);
handler = null;
runner = null;
Toast.makeText(context, "NO", Toast.LENGTH_SHORT).show();
return true;
}
}
return false;
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.