我目前有一个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循环。
答案 0 :(得分:3)
将无限循环放在Thread
内。有它,你可以在里面有一个控制变量(如playing
),再次点击,你想停止,只需将其设置为假。 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;
}
答案 1 :(得分:0)
试试这个:
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;
}
});