定期执行操作的最佳方法[在应用程序运行时] - Handler?

15

我正在尝试定期执行一个操作。我想在每隔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();
2个回答

20

我在我的安卓应用程序中正在做类似的事情;每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。这会创建一个新的Thread,当它完成时向UI发送一条消息,因此您可以使用周期函数的新结果更新UI。

如果您不需要使用此周期函数的结果来更新UI,则可以简单地忽略我代码示例的第二部分,只需像所示那样生成一个新的Thread。请注意,但是:如果您正在修改由此新的Thread和UI共享的变量,则如果您不进行同步,您将遇到问题。总的来说,线程不是您想要忽略“良好的编程实践”的领域,因为您会遇到奇怪的,不可预测的错误,并且你会咒骂你的程序。

-tjw


是的,那么我的方法正是你想要的。顶部代码块将是你的“计时器”,底部代码块将执行使单个图像从屏幕顶部落下的代码。 - Travis Webb
for循环的参数应该是什么? - Hani Honey
3
for(;;)表示循环会一直运行下去,相当于while(true)。如果你想让它在某个点停止,你需要加入自己的条件。 - Travis Webb
好的,明白了。所以从技术上讲,如果我只想在游戏状态为真时运行它(比如当人只剩下3条命或者无论我想怎么做),我可以将那个for循环替换为while循环吗?while(game == true)? - Hani Honey
是的,while(game) { ... } 会首先检查并确保 game 变量为真;当你退出游戏时,你需要调用 timer.interrupt(),这样循环就会立即退出,而不是等待3秒钟。 - Travis Webb
显示剩余10条评论

9

最简单的方法是在View(例如小部件)上使用postDelayed()来安排执行工作的Runnable,然后重新安排自己。


2
请提供要翻译的具体内容。 - powder366

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接