android-等待用户循环,除非它点击按钮

时间:2016-09-08 03:44:08

标签: android onclicklistener

我的代码没有等待用户点击,我不知道该怎么做。请看评论。我正在制作卡片游戏,其中有3个电脑播放器和一个用户。但我不知道如何等待用户点击任何卡然后在循环的每次迭代中播放。这是我的粗略代码。谢谢提前。

inp=0,k=0; //global variable 
function onCreate()
{
added listner to 13 imageviews 
A(); // call to A()
}
function A()
{
// I want to wait here to get updated value of inp when user clicks image to
// perform some operation with inp and remove that imageView.
k++;
if(k<13)
A();


}
function onClick(view)
{
switch:
  case img1:
    inp=0;
    break;
 case img2:
    inp=2;
    break;
 case img3:
    inp=3;
    break;
  .
  .
  .
  .
  13 cases

}

4 个答案:

答案 0 :(得分:1)

不要在onCreate方法中调用函数A()。 在发生单击事件时调用它,在设置inp = something之后在onClick方法结束时调用它,然后在函数A()中使用该值,使用该值执行操作。

答案 1 :(得分:0)

尝试rxjava,很容易观察到inp值已更改然后执行您的愿望功能,例如:

private int inp = 0;
private BehaviorSubject<Integer> intValueObserve;

private void inpValueChangedCallBack() {
    intValueObserve = BehaviorSubject.create(inp);
    intValueObserve.subscribe(new Action1<Integer>() {
        @Override
        public void call(Integer integer) {
            Log.d("TAG", "new value: " + integer.intValue());
            // perform `remove image view` here
        }
    });
}

...

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.home_activity);

    inpValueChangedCallBack();
}

....

@Click(R.id.add_record)
void add() {
    inp++;
    intValueObserve.onNext(inp); // adding this into the end of your onClick function
    Log.d("TAG", "increase inp: " + inp);
}

日志作为我的测试:

D/TAG: new value: 1
D/TAG: increase inp: 1
D/TAG: new value: 0
D/TAG: decrease intp: 0
D/TAG: new value: 1
D/TAG: increase inp: 1
D/TAG: new value: 2
D/TAG: increase inp: 2

希望这有帮助!

答案 2 :(得分:0)

Android几乎与每个GUI操作系统一样,都是事件驱动的。这意味着后台有一个事件循环。那个事件循环完成了所有的等待。你永远不应该等待任何事情 - 事实上如果你试着冻结UI线程并且没有响应,从不回应输入。操作系统将调用您在事件发生时注册的点击监听器。这是事件驱动编程的基本思想 - 操作系统会告诉您事件何时发生。

答案 3 :(得分:-1)

如果你想等待尝试使用Thread.Sleep();

while(condition == true)
{
    try {
       Thread.Sleep(Time);
         } catch(InterruptedException e){}
}