java - 如何在Android中设置延迟
问题描述
我知道 java/androidStudio 中的Thread.sleep()
andpostDelayed()
函数。但这里有一个问题,我正在创建一个西蒙说游戏的复制品。
我创建了一个generateSequence()
函数,将 1-9 的数字随机放入一个名为sequence
. 之后,我需要显示这些序列,这基本上会改变 textView 的背景一秒钟,然后使用该postDelayed()
函数返回其原始背景。
这是我的代码:
private void displaySequence(){
for(int i = 0; i < sequence.size(); i++) {
if(sequence.get(i) == 1) {
viewCard11.setBackgroundResource(R.drawable.text_view_circle4);
proceed = false;
handler.postDelayed(() -> {
viewCard11.setBackgroundResource(R.drawable.text_view_circle3);
proceed = true;
}, 1000);
}
else if(sequence.get(i) == 2) {}
else if(sequence.get(i) == 3) {}
else if(sequence.get(i) == 4) {}
else if(sequence.get(i) == 5) {}
else if(sequence.get(i) == 6) {}
else if(sequence.get(i) == 7) {}
else if(sequence.get(i) == 8) {}
else if(sequence.get(i) == 9) {}
while(!proceed) {}
}
}
但问题postDelayed()
在于,只有函数内部的任何内容都会被延迟。这意味着如果它sequence
有 2 个元素,它将同时闪烁背景。for
循环不会等待 完成它应该做的任何postDelayed
事情,而是递增并继续放置下一个postDelayed
。
为了解决这个问题,我尝试使用proceed
布尔变量作为延迟。我所做的是,在我们调用 之前postDelayed
,我设置proceed
为false
。由于它不会等待postDelayed()
,它将转到下一行代码,即while
循环。
通过设置proceed
为假,我用它来创建一个无限循环。但是这个无限循环会被已完成postDelayed()
的as打断,proceed
在里面设置为true,然后代码就可以继续for
循环了。
但我不确定为什么它根本不起作用。当我运行代码时,它只显示一个空白屏幕。似乎问题存在于无限while
循环中并且postDelayed()
无法更新proceed
变量。
我尝试将Thread.sleep(1000)
其用作 的替代品postDelayed
,但在启动过程中,无论参数传递到多长时间,程序都只是显示白色背景Thread.sleep()
我已经用尽了我的选择,我希望有人有更好的主意。谢谢你。
解决方案
循环不会等待 postDelayed,因为 postDelayed 中的内容是异步发生的。这意味着它在第二个线程上独立于 UI 线程工作。您要完成的是让 UIthread 等待一段时间,而不是在特定时间后启动另一个线程。您可以尝试以这种方式使用处理程序:
Handler handler=new Handler()
{
public void handleMessage(Message msg)
{
if(msg.what==0)
{
viewCard11.setBackgroundResource(R.drawable.text_view_circle3);
proceed = true;
}
}
};
然后你可以像这样使用处理程序:
handler.postDelayed(() ->
{
//does nothing just waits 1 second and then send empty message
handler.sendEmptyMessage(0)
}, 1000);
推荐阅读
- javascript - 这个特定的嵌套 for 循环如何在原生 JavaScript 中工作?
- python - 熊猫选择相应 nan 值的前一列值
- python - jinja2.exceptions.TemplateNotFound 错误的问题
- c++ - 编译器差异:在 const 成员函数中定义的可变 lambda 中捕获值时的“this”类型
- bash - 使用变量设置 Docker GitLab root 密码?
- java - equalsIgnoreCase 在自身上被调用。错误
- reactjs - Material-UI:`css` 功能已弃用。改用 `styleFunctionSx`
- python - 用于裁剪的 GUI 测量图片大小
- reactjs - “TypeError:graphql.isType 不是函数”
- reactjs - 收到来自 firebase 云消息传递的消息后调度操作