如何模拟延迟?
How to simulate a delay?
我想让我的 Android 应用程序进行自动演示,因此在用户单击 "Auto Demo" 按钮后,它会切换到视图并延迟一秒钟,然后单击该按钮上的按钮查看,然后 2 秒后单击该屏幕上的另一个按钮.. 依此类推,我的 java 代码如下所示:
private class AutoDemoListener implements View.OnClickListener
{
public void onClick(View v)
{
Is_AutoDemo_B=true;
Out("AutoDemoListener");
switchView(demoView, registrationView);
startRegistration();
Thread t = new Thread(new Runnable()
{
@Override
public void run()
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
try
{
registrationView.symbolButton[2][8].performClick();
Thread.sleep(1000);
registrationView.symbolButton[4][13].performClick();
Thread.sleep(2000);
registrationView.symbolButton[0][1].performClick();
Thread.sleep(1000);
registrationView.symbolButton[6][18].performClick();
}
catch (InterruptedException e) { e.printStackTrace(); }
}
});
}
});
t.start();
Is_AutoDemo_B=false;
}
}
但它现在做的是:等待 4 秒并一次模拟所有 4 次点击,因此每次点击之间没有延迟,正确的做法是什么?
TimeUnit.SECONDS.sleep(1);
参见 How do I make a delay in Java? is also in Android https://developer.android.com/reference/java/util/concurrent/TimeUnit
也许会生成新线程,在这些子线程中休眠并阻塞主线程直到子线程出现 returns。 @Tenfour04 的回答与我认为生成线程的概念类似......
您必须在后台执行延迟,并且每次 post 结果返回 UI。
您可以使用处理程序执行此操作。 UI 线程已经附带了一个准备好的 Looper,可以让您轻松使用 Handler(其他线程没有,需要更多设置)。
runnable 的嵌套看起来很讨厌,所以这里只是增加了延迟:
private class AutoDemoListener implements View.OnClickListener
{
public void onClick(View v)
{
Is_AutoDemo_B=true;
Out("AutoDemoListener");
switchView(demoView, registrationView);
startRegistration();
final Handler handler = new Handler();
registrationView.symbolButton[2][8].performClick();
handler.postDelayed(new Runnable() {
public void run() {
registrationView.symbolButton[4][13].performClick();
}
}, 1000);
handler.postDelayed(new Runnable() {
public void run() {
registrationView.symbolButton[0][1].performClick();
}
}, 3000);
handler.postDelayed(new Runnable() {
public void run() {
registrationView.symbolButton[6][18].performClick();
}
}, 5000);
handler.postDelayed(new Runnable() {
public void run() {
Is_AutoDemo_B=false;
}
}, 5100);
}
}
在 Kotlin 中,使用协程可能会更简洁:
val autoDemoListener = View.OnClickListener {
Is_AutoDemo_B = true
Out("AutoDemoListener")
switchView(demoView, registrationView)
startRegistration()
CoroutineScope(Job() + Dispatchers.Main).launch {
registrationView.symbolButton[2][8].performClick()
delay(1000)
registrationView.symbolButton[4][13].performClick()
delay(2000)
registrationView.symbolButton[0][1].performClick()
delay(1000)
registrationView.symbolButton[6][18].performClick()
Is_AutoDemo_B=false
}
}
我想让我的 Android 应用程序进行自动演示,因此在用户单击 "Auto Demo" 按钮后,它会切换到视图并延迟一秒钟,然后单击该按钮上的按钮查看,然后 2 秒后单击该屏幕上的另一个按钮.. 依此类推,我的 java 代码如下所示:
private class AutoDemoListener implements View.OnClickListener
{
public void onClick(View v)
{
Is_AutoDemo_B=true;
Out("AutoDemoListener");
switchView(demoView, registrationView);
startRegistration();
Thread t = new Thread(new Runnable()
{
@Override
public void run()
{
runOnUiThread(new Runnable()
{
@Override
public void run()
{
try
{
registrationView.symbolButton[2][8].performClick();
Thread.sleep(1000);
registrationView.symbolButton[4][13].performClick();
Thread.sleep(2000);
registrationView.symbolButton[0][1].performClick();
Thread.sleep(1000);
registrationView.symbolButton[6][18].performClick();
}
catch (InterruptedException e) { e.printStackTrace(); }
}
});
}
});
t.start();
Is_AutoDemo_B=false;
}
}
但它现在做的是:等待 4 秒并一次模拟所有 4 次点击,因此每次点击之间没有延迟,正确的做法是什么?
TimeUnit.SECONDS.sleep(1);
参见 How do I make a delay in Java? is also in Android https://developer.android.com/reference/java/util/concurrent/TimeUnit
也许会生成新线程,在这些子线程中休眠并阻塞主线程直到子线程出现 returns。 @Tenfour04 的回答与我认为生成线程的概念类似......
您必须在后台执行延迟,并且每次 post 结果返回 UI。
您可以使用处理程序执行此操作。 UI 线程已经附带了一个准备好的 Looper,可以让您轻松使用 Handler(其他线程没有,需要更多设置)。
runnable 的嵌套看起来很讨厌,所以这里只是增加了延迟:
private class AutoDemoListener implements View.OnClickListener
{
public void onClick(View v)
{
Is_AutoDemo_B=true;
Out("AutoDemoListener");
switchView(demoView, registrationView);
startRegistration();
final Handler handler = new Handler();
registrationView.symbolButton[2][8].performClick();
handler.postDelayed(new Runnable() {
public void run() {
registrationView.symbolButton[4][13].performClick();
}
}, 1000);
handler.postDelayed(new Runnable() {
public void run() {
registrationView.symbolButton[0][1].performClick();
}
}, 3000);
handler.postDelayed(new Runnable() {
public void run() {
registrationView.symbolButton[6][18].performClick();
}
}, 5000);
handler.postDelayed(new Runnable() {
public void run() {
Is_AutoDemo_B=false;
}
}, 5100);
}
}
在 Kotlin 中,使用协程可能会更简洁:
val autoDemoListener = View.OnClickListener {
Is_AutoDemo_B = true
Out("AutoDemoListener")
switchView(demoView, registrationView)
startRegistration()
CoroutineScope(Job() + Dispatchers.Main).launch {
registrationView.symbolButton[2][8].performClick()
delay(1000)
registrationView.symbolButton[4][13].performClick()
delay(2000)
registrationView.symbolButton[0][1].performClick()
delay(1000)
registrationView.symbolButton[6][18].performClick()
Is_AutoDemo_B=false
}
}