2014-01-28 41 views
0

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

+1

关键的问题是,你正在运行的无限循环在UI线程上,以便阻止它接收进一步的触摸事件。 – sddamico

回答

3

将无限循环放入Thread。有了它,你可以在里面有一个控制变量(如playing),一旦再次点击,你想停止,只需将其设置为false。平行运行的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; 
} 
+0

谢谢。这听起来很有希望,但我不知道该如何写。你有一个例子吗? – user2323030

+0

我添加了一个例子,检查它。 – nKn

+0

我已经复制了上面所写的示例,但IDE(Eclipse,在本例中)一直告诉我Runnable()区域存在语法错误。我尝试添加/删除括号和括号,但仍然存在错误;我不知道为什么。你知道我可能会错过什么吗? – user2323030

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; 
    } 
}); 
+0

我看到'runner.run()',但有没有像'runner.stop()'(或类似)来暂停Runnable?另外,我应该将我的while循环移动到'run()'方法内部吗? – user2323030