我试图定期执行一个动作.我想创建一个类的新实例,比如说,3秒.最好通过使用Handler或Thread实现这一点吗?有没有一种更容易,多样的方式我可以尝试?我真的不善于使用线程 – 我想学习,但更重要的是让我在这个功能之前,担心好的编程实践.
new Thread(){ public void run(){ //makes sure the player still has 3 lives left while(game == false){ uiCallback.sendEmptyMessage(0); try { Thread.sleep(2000); // wait two seconds before drawing the next flower } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //sleep for 2 seconds } } }.start();
解决方法
我在Android应用程序中做类似的事情我每10秒在我的界面更新一些数据.有很多方法可以做到这一点,但是我选择使用Handler,因为它很简单:
Thread timer = new Thread() { public void run () { for (;;) { // do stuff in a separate thread uiCallback.sendEmptyMessage(0); Thread.sleep(3000); // sleep for 3 seconds } } }); timer.start(); ... private Handler uiCallback = new Handler () { public void handleMessage (Message msg) { // do stuff with UI } };
您可能知道,您不能在UI线程中运行这样的定期功能,因为它会阻止UI.这将创建一个新的线程,在完成后向UI发送消息,因此您可以使用定期功能的新结果更新UI.
如果您不需要使用此周期函数的结果来更新UI,则可以简单地忽略我的代码示例的后半部分,并且只会生成一个新线程,如图所示.但是,请注意:如果您要修改此新线程和UI共享的变量,那么如果不同步,则会遇到问题.一般来说,线程不是您想要忽略“良好的编程实践”的领域,因为您会收到奇怪的,不可预知的错误,您将会诅咒您的程序.
-tjw