首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android:定期执行代码

Android:定期执行代码
EN

Stack Overflow用户
提问于 2012-04-18 18:34:55
回答 5查看 29.7K关注 0票数 34

我需要定期执行一些代码(连接到服务器并每分钟从MySQL数据库中提取数据)。为此,我有一个Sync类:

代码语言:javascript
复制
public class Sync {

    static private Handler handler = new Handler();
    Runnable task;

    public Sync(Runnable task, long time) {
        this.task = task;
        handler.removeCallbacks(task);
        handler.postDelayed(task, time);
    }
}

在我的活动中,我有:

代码语言:javascript
复制
public void onCreate(Bundle savedInstanceState) {
    ...
    Sync sync = new Sync(call,60*1000);
    ...
}

final private Runnable call = new Runnable() {
    public void run() {
    //This is where my sync code will be, but for testing purposes I only have a Log statement
    Log.v("test","this will run every minute");
    }
};

我已经用较短的测试时间尝试过这个方法,但它只运行一次。当它第一次记录消息时,也是最后一次。有没有人看到我在这里做什么?谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-04-18 18:44:34

你可以使用下面的代码来做到这一点,希望它能有所帮助!

代码语言:javascript
复制
final Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 

    @Override 
    public void run() { 
        try{
            //do your code here
        }
        catch (Exception e) {
            // TODO: handle exception
        }
        finally{
            //also call the same runnable to call it at regular interval
            handler.postDelayed(this, 1000); 
        }
    } 
}; 

//runnable must be execute once
handler.post(runnable);
票数 57
EN

Stack Overflow用户

发布于 2012-04-18 18:53:23

首先,你必须声明全局的处理程序;其次,你必须在runnable中再次使用post延迟方法来再次触发它。

代码语言:javascript
复制
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Sync sync = new Sync(call,60*1000);

    }
    final private Runnable call = new Runnable() {
        public void run() {
        //This is where my sync code will be, but for testing purposes I only have a Log statement
        Log.v("test","this will run every minute");
        handler.postDelayed(call,60*1000);
        }
    };
    public final Handler handler = new Handler();
    public class Sync {


        Runnable task;

        public Sync(Runnable task, long time) {
            this.task = task;
            handler.removeCallbacks(task);
            handler.postDelayed(task, time);
        }
    }


}
票数 8
EN

Stack Overflow用户

发布于 2012-04-18 18:45:46

handler.postDelayed(task, time);只执行一次,如果你想让代码定期触发,我建议使用TimerTimerTask,而不是HandlerRunnable

TimerTasks可以设置为运行一次,每x秒运行一次,或者以固定的周期运行,例如x秒-无论上次运行花费了多长时间。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10207612

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档