你如何让android中的代码暂停几秒钟?

时间:2010-11-06 04:34:01

标签: java android time wait

基本上我需要暂停(基于几秒钟)才能进行一次操作,以便用户可以看到在采取下一个操作之前会发生什么。因此,对于二十一点,当经销商轮到他决定击中时,他会命中,一张牌被添加,然后他决定接下来该做什么。因此,在他决定下一步该做什么之前,我希望代码暂停,以便可以“看到”经销商在做什么,这样经销商不会在不到一秒的时间内完成他的行动而玩家只能看到结果。

提前致谢!

我应该注意到我尝试过使用wait(这里插入数字);但是我被eclipse告知它会导致堆栈拦截错误或类似的东西并引发异常,从而无所作为:(

这很有趣,(我编程的方式至少可以说是“有趣”)我做了Thread.sleep(5000)并把它扔到了试试捕获之下,它确实睡了5秒钟然后继续做代码。但是,在我按下按钮之后才会显示我对视图的更新(真的很讨厌事件驱动编程)。

1 个答案:

答案 0 :(得分:96)

学习以事件来思考确实是关键。你能行的。 :)

第一条规则是:永远不会停止UI线程。 UI线程负责让您的应用程序保持响应。你在那里做的任何工作都不应该阻止;做你需要做的事情并尽快回来。绝对避免在UI线程上进行I / O. (在某些地方,由于生命周期要求,您无法真正帮助它,例如在onPause中保存应用状态。)如果您在UI上调用Thread.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秒后,您将看到在doStuff中创建的吐司。

如果您正在撰写自定义View,那就更容易了。视图有自己的postDelayed方法,可以将所有内容发布到正确的Handler,而您无需创建自己的。{/ p>

第二条规则是:视图应该在UI线程上进行修改。你得到和忽略的那些例外意味着出错了,如果你忽略它们,你的应用程序可能会以有趣的方式开始行为不端。如果您的应用程序在其他线程中完成大部分工作,您可以{\ n}}将事件直接发送到要修改的视图,以便修改能够正确运行。

如果您从代码的该部分引用了Activity,那么您也可以使用post,这正是其名称所暗示的内容。如果发布到单个视图在上下文中没有意义,那么您可能更喜欢这种方法。

对于在点击按钮之前没有显示的视图的更新,这些视图是什么类型的?他们是自定义视图正在绘制这些更新吗?如果是这样,您是否记得在数据更改后调用Activity#runOnUIThread来触发重绘?视图仅在无效后重绘。