) 我正在创建一个记忆游戏。我的问题是,每当我第二次点击时,我甚至看不到切换按钮。要清楚 - 首先点击切换togglebutton,所以我可以看到它保持的数字,第二次点击不同的togglebutton用于切换它,显示数字然后继续设置得分+1如果数字是如果它们不同,或者将它们反转回来。
下面是我用作onClick函数的代码,我一直在考虑在第二个“if block”中放置某种睡眠或延迟函数 - (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;
}
}
}
}
}
答案 0 :(得分:51)
您可以将延迟消息发布到处理程序(具有关联的runnable),并让它更新UI,而不是在onclick中休眠。显然,这适用于您的应用程序的设计并使其工作,但基本的想法是:
//Here's a runnable/handler combo
private Runnable mMyRunnable = new Runnable()
{
@Override
public void run()
{
//Change state here
}
};
然后从onClick中将延迟消息发布到处理程序,指定要执行的runnable。
Handler myHandler = new Handler();
myHandler.postDelayed(mMyRunnable, 1000);//Message will be delivered in 1 second.
根据你的游戏有多复杂,这可能不是你想要的,但它应该给你一个开始。
答案 1 :(得分:34)
正确地工作:
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//Do something after 100ms
}
}, 100);
答案 2 :(得分:2)
你永远不应该在UI线程中睡觉(默认情况下你的所有代码都在UI线程中运行) - 它只会让UI冻结,不会让某些东西改变或完成。我无法提出更多建议,因为我不了解代码逻辑。
答案 3 :(得分:2)
不在UI线程中休眠。您需要另一个线程来查找UI线程中的“唤醒并等待”消息。然后,第二个线程可以在正常的睡眠呼叫后隐藏。然后,您可以在下次需要隐藏某些内容时保留该线程,或者在每次需要另外延迟时将其删除并添加新内容。
我相信有一些“postFoo”函数可能在这个上下文中有用(从UI线程外部触发UI事件)。
答案 4 :(得分: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);
}
});