2010-11-06 216 views
35

基本上,我需要暂停(基于几秒钟)才能将其放入一个操作中,以便用户可以看到在执行下一个操作之前会发生什么。所以对于二十一点,轮到经销商时,他决定击中,他命中,一张牌被添加,然后他决定下一步该做什么。因此,在决定下一步做什么之前,我希望代码暂停,以便可以“看到”经销商以这种方式进行的操作,庄家不会在一秒钟内完成自己的操作,并且玩家只能看到结果。如何让代码在android中暂停几秒钟?

提前致谢!

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

嗯,这很有趣,(我编程的方式是“有趣的”至少说)我做了Thread.sleep(5000)并把它扔到try catch下面,它会休眠5秒,然后继续执行代码。但是,只有按下按钮后才会显示视图的更新(难道真的恨事件驱动编程)

回答

93

学习思考的事件而言确实是这里的关键,您可以做到这一点:)

的第一条规则是:永远不要拖延UI线程。 UI线程负责保持您的应用程序的响应。你在那里做的任何工作都不应该阻止;尽你所能去做并尽快回复。绝对避免在UI线程上执行I/O操作。 (有一些地方,你不能真正帮助它因生命周期的要求,例如节省应用状态。)如果你曾经 UI线程上调用Thread.sleep你做错了。

的Android强制执行此与“应用程序没有响应”(或“ANR”)错误用户看到。每当你在Android应用程序中看到它时,这意味着开发者做了一些事情导致UI线程停顿太久。如果设备由于某种原因真的陷入困境,这个错误可能实际上并不是应用程序开发者的错,但通常这意味着该应用程序出错了。

您可以通过发布自己的活动来使用此模型。这给你一个简单的方式来告诉你的应用,“稍后再做”。在Android中发布您自己的活动的关键在Handler类。方法postDelayed可以让您安排Runnable,它将在一定的毫秒数后执行。

如果你有一个看起来像这样的活动:创建活动,则5秒后

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(); 
    } 
} 

,你会看到在doStuff创建的敬酒。

如果你正在写一个自定义的View那就更简单了。视图有自己的postDelayed方法,可以将所有内容发布到正确的Handler,而且您不需要创建自己的。

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

如果您从代码的该部分引用了您的Activity,则还可以使用Activity#runOnUIThread,这正如其名称所暗示的。如果张贴到单个视图在上下文中没有意义,您可能更喜欢这种方法。

至于更新视图才会出现,直到您按下按钮,这些视图是什么样的?他们是否正在绘制这些更新的自定义视图?如果是这样,你是否记得在数据更改后调用invalidate来触发重绘?视图仅在其失效后重新绘制。

+0

那么看到我的方式的错误是,我试图修改在不断运行的不同线程的视图,以便UI不会锁定...因为我不知道如何通过由我运行的线程生成的值...传递给UI。虽然令人难以置信的有帮助,但我非常感谢您的支持 – 2010-11-06 22:03:21

+0

使用AsyncTask – Falmarri 2010-11-07 07:23:55