如何在Android的onClick函数中设置延迟

19
我正在创建一个记忆游戏。我的问题是,无论何时我点击第二次,我甚至看不到切换按钮。清楚地说,第一次单击会切换切换按钮,这样我就可以看到它所持有的数字,第二次单击不同的切换按钮应该会切换它,显示数字,然后继续设置得分+1(如果数字相同),或者如果它们不同,则将其反转回来。

以下是我用作onClick函数的代码,我一直在考虑在第二个“if块”中放置某种睡眠或延迟函数。

任何关于此主题的帮助都将不胜感激。

public void onClick(View view) {
for (int i = 0; i < karta.length; i++){
    if (view == karta[i]){
        karta[i].setEnabled(false);
        klikniecia++;
        if (klikniecia == 1){
            kartaID[0]=i;
            kartaWartosc[0]=listaKart.get(i);

        }
        if (klikniecia == 2){
            kartaID[1]=i;
            kartaWartosc[1]=listaKart.get(i);

            //i think, about setting a delay here, so i can see both of the cards, regardles if the're the same or not before reverting them.

            if (czyPara()){
                karta[kartaID[0]].setEnabled(false);
                karta[kartaID[1]].setEnabled(false);
                klikniecia=0;
            }
            else{

                karta[kartaID[0]].setEnabled(true);
                karta[kartaID[0]].toggle();
                karta[kartaID[1]].setEnabled(true);
                karta[kartaID[1]].toggle();
                klikniecia=0;

            }
        }

    }

}

}


12
为什么人们在代码中仍然使用非英语名称?这使得那些不会说$language的人很难理解和阅读。 - ThiefMaster
2
在编写代码时,我更喜欢使用波兰语变量名称,而且当我写代码时,我不会考虑其他人是否会查看它;-) 不过在未来更复杂的项目中,我可能会考虑使用英语 :-) - Piotrgo
5个回答

51

你可以将延迟消息发布到处理程序(具有相关可运行项),并由其更新UI,而不是在onclick中进行休眠。显然,将其纳入应用程序设计并使其正常工作,但基本思想是这样的:

//Here's a runnable/handler combo
private Runnable mMyRunnable = new Runnable()
{
    @Override
    public void run()
    {
       //Change state here
    }
 };

然后从onClick方法中,您可以向处理程序发送延迟消息,指定要执行的可运行对象。

Handler myHandler = new Handler();
myHandler.postDelayed(mMyRunnable, 1000);//Message will be delivered in 1 second.

根据您的游戏复杂程度,这可能不完全符合您的要求,但它应该能给您一个起点。


如果我理解正确的话,这个概念是我应该将想要延迟的代码部分包装在可运行对象中,然后从onclick中引用它并设置延迟。这似乎是一个好主意。我今天会尝试一下,但我认为它会起作用 :-) - Piotrgo
在这种情况下,我该如何向可运行对象传递参数? - Yashpal Singla

34

正确工作:

final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
  @Override
  public void run() {
    //Do something after 100ms
  }
}, 100);

2

默认情况下,所有代码都在UI线程中运行,因此您永远不应该在UI线程中睡眠 - 这只会导致UI冻结,不能让某些操作完成或改变。由于我不了解代码逻辑,因此无法提供更多建议。


2
不要在UI线程中睡眠。您需要另一个线程来查找来自UI线程的“唤醒并等待”消息。然后,第二个线程可以在正常的睡眠调用后执行隐藏操作。然后,您可以保留该线程以便下次需要隐藏某些内容,或者每次需要延迟时杀死它并创建一个新线程。
我认为在这种情况下可能会有一些“postFoo”函数非常有用(从UI线程外触发UI事件)。

1
b.setOnClickListener(new OnClickListener() {

    public void onClick(View arg0) {
        // TODO Auto-generated method stub

        final ProgressDialog myPd_ring=ProgressDialog.show(MainActivity.this, "confident checker", "calculating please wait..", true);
        myPd_ring.setCancelable(true);
        new Thread(new Runnable() {  
              public void run() {
                    // TODO Auto-generated method stub


                    try
                    {
                          Thread.sleep(5000);


                    }
                    catch(Exception e){}
                    b.dismiss();
              }
        }).start();


        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
          public void run() {
              Toast.makeText(getApplicationContext(), "today your confident level is 90% ",
                        Toast.LENGTH_LONG).show();

          }
        }, 5000);


    }
});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接