[应用程序运行时]定期执行操作的最佳方式 - 处理程序?

Han*_*ney 11 multithreading android handler

我正在尝试定期执行某项操作.我想创建一个类的新实例,比如说,持续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();
Run Code Online (Sandbox Code Playgroud)

Tra*_*ebb 13

我在我的Android应用程序中做了类似的事情; 我每隔10秒更新一次界面中的一些数据.有很多方法可以做到这一点,但我选择使用a,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
    }
};
Run Code Online (Sandbox Code Playgroud)

您可能知道,您无法在UI线程中运行此类周期性函数,因为它会阻止UI.这会创建一个Thread在完成后向UI发送消息的新消息,因此您可以使用您的定期函数所做的任何新结果更新UI.

如果您不需要使用此周期函数的结果更新UI,则可以忽略代码示例的后半部分,并生成一个新的Thread,如图所示.但是要注意:如果要修改此新ThreadUI和UI 共享的变量,如果不进行同步,则会遇到问题.一般来说,线程不是一个你想忽略"良好编程实践"的领域,因为你会得到奇怪的,不可预测的错误,你会诅咒你的程序.

-tjw

  • `for(;;)`表示循环永远运行.它相当于`while(true)`.如果您希望它在某个时刻停止,您需要添加自己的条件. (3认同)

Com*_*are 9

最简单的方法是postDelayed()View(例如,小部件)上使用来安排Runnable确实有效,然后重新安排自己.

  • 示例:http://stackoverflow.com/questions/6242268/repeat-a-task-with-a-time-delay/6242292#6242292 (2认同)