你如何让代码在Android中暂停几秒钟?

2022-09-01 02:51:57

基本上,我需要暂停(仅基于几秒钟)才能放入一个操作中,以便用户可以在采取下一个操作之前看到发生了什么。所以对于二十一点,当轮到荷官时,他决定击中,他击中,添加一张牌,然后他决定下一步做什么。因此,在他决定下一步该做什么之前,我希望代码暂停,以便可以“看到”庄家正在做什么,这样庄家就不会在不到一秒钟的时间内完成他的操作,玩家只能看到结果。

提前致谢!

我应该注意我已经尝试过使用等待(在这里插入数字);但是 eclipse 告诉我,它会导致堆栈拦截错误或类似的东西,并抛出一个异常,因此什么都不做:(

嗯,这很有趣,(至少可以说,我编程这些东西的方式是“有趣的”),我做了Thread.sleep(5000)并将其放在一个尝试捕获下,它确实休眠了5秒钟,然后继续执行代码。但是,直到我按下按钮后,我对视图的更新才会显示(真的很讨厌事件驱动的编程)。


答案 1

学会根据事件来思考确实是这里的关键。你可以的。:)

第一条规则是:永远不要使 UI 线程停止。UI 线程负责保持应用响应感。你在那里做的任何工作都不应该被阻止;做你需要做的事情,并尽快返回。绝对避免在UI线程上进行I / O。(由于生命周期要求,有些地方您无法真正帮助它,例如将应用程序状态保存在 .如果您曾经调用UI线程,那么您做错了。onPauseThread.sleep

Android 会通过用户看到的“应用程序无响应”(或“ANR”)错误强制执行此命令。每当您在Android应用程序中看到此内容时,都意味着开发人员做了一些导致UI线程停滞太长时间的事情。如果设备由于某种原因确实陷入困境,则此错误实际上可能不是应用程序开发人员的错,但通常意味着应用程序做错了什么。

您可以通过发布自己的事件来使用此模型来发挥自己的优势。这为你提供了一种简单的方法来告诉你的应用,“稍后再执行此操作”。在 Android 中,发布自己的事件的密钥位于 Handler 类中。postDelayed 方法允许您计划将在特定毫秒数后执行的 Runnable

如果您的活动如下所示:

public class MyActivity extends Activity {
    private Handler mHandler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mHandler.postDelayed(new Runnable() {
            public void run() {
                doStuff();
            }
        }, 5000);
    }

    private void doStuff() {
        Toast.makeText(this, "Delayed Toast!", Toast.LENGTH_SHORT).show();
    }
}

然后,在创建活动 5 秒后,您将看到 在 中创建的 toast。doStuff

如果您正在编写自定义内容,那就更容易了。视图有自己的 postDelayed 方法,该方法会将所有内容发布到正确的位置,您无需创建自己的方法。ViewHandler

第二条规则是:只能在 UI 线程上修改视图。你得到和忽略的那些例外意味着出了什么问题,如果你忽略它们,你的应用程序可能会开始以有趣的方式表现不佳。如果你的应用在其他线程中完成大部分工作,你可以将事件直接发布到要修改的视图,以便修改将正确运行。

如果您从代码的该部分引用了您的,则还可以使用Active#runOnUIThread,它完全符合名称的含义。如果发布到单个视图在上下文中没有实际意义,则您可能更喜欢此方法。Activity

至于在点击按钮之前不显示的视图更新,这些是哪种视图?它们是绘制这些更新的自定义视图吗?如果是这样,您是否记得在数据更改后调用 invalidate 来触发重绘?视图仅在失效后重新绘制。


答案 2

推荐