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

Posted

技术标签:

【中文标题】如何在 Android onClick 函数中设置延迟【英文标题】:How to set delay in Android onClick function 【发布时间】:2011-05-11 02:18:02 【问题描述】:

) 我正在创建一个记忆游戏。我的问题是,每当我第二次点击时,我什至看不到切换按钮。要清楚 - 第一次单击切换切换按钮,所以我可以看到它持有的数字,第二次单击不同的切换按钮应该切换它,显示数字,然后继续设置分数 +1,如果数字是相同,或者如果它们不同,则再次反转它们。

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

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

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;

            
        

    


【问题讨论】:

为什么人们仍然在他们的代码中使用非英语名称?对于不会说 $language 的人来说,这使得理解/阅读变得非常困难。 在代码中使用波兰语变量名称对我来说更容易,而且当我编写它时,我不会考虑其他人会看到它;-) 虽然在未来更复杂的项目中我可能会考虑使用英语:-) 【参考方案1】:

您可以将延迟消息发布到处理程序(具有关联的可运行对象)并让它更新 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 延迟引用它。这似乎是个好主意。我今天会试试这个,但我认为它会起作用:-) 在这种情况下如何将参数传递给 runnable【参考方案2】:

正确工作:

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

【讨论】:

【参考方案3】:

您永远不应该在 UI 线程中休眠(默认情况下,您的所有代码都在 UI 线程中运行)——它只会让 UI 冻结,而不会让某些事情发生变化或完成。我无法提出更多建议,因为我不懂代码逻辑。

【讨论】:

【参考方案4】:

在 UI 线程中休眠。您需要另一个线程来从您的 UI 线程中查找“唤醒并等待”消息。然后,第二个线程可以在正常的睡眠呼叫后进行隐藏。然后,您可以在下次需要隐藏某些内容时保留该线程,或者在每次需要再次延迟时将其杀死并重新创建一个。

我相信有一些“postFoo”函数可能在这种情况下有用(从 UI 线程外部触发 UI 事件)。

【讨论】:

【参考方案5】:
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);


    
);

【讨论】:

以上是关于如何在 Android onClick 函数中设置延迟的主要内容,如果未能解决你的问题,请参考以下文章

如何在默认情况下停止 datetimepicker 在文本框中设置今天的日期 onclick

由于在编辑器类中设置 onClick 侦听器时出现空指针异常,Android 应用程序崩溃

如何在Option android中设置重复的最大计数到getOrElse函数

安卓按键响应的方式

如何在 Django 表单输入字段中设置事件处理程序

android editText如何在代码中设置可以编辑?