当用户点击屏幕时如何退出无限循环?

时间:2014-01-28 18:06:27

标签: java android while-loop

我目前有一个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循环。

2 个答案:

答案 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;
    }
});