每秒执行一次方法

时间:2013-12-26 13:00:28

标签: java android multithreading

我想在android中每秒执行一些代码,但我想在一个线程(主线程)中执行。到目前为止,我有这个:

locationTimer = new Timer("locationTimer", false);
locationTimer.schedule(new LocationCheckerTask(this), 0, 1000);

public class LocationCheckerTask extends TimerTask {
    private GeoWatcher watcher;

    public LocationCheckerTask(Context context) {
        watcher = new GeoWatcher(context);
    }

    @Override
    public void run() {
        // funky stuff
    }
}

不幸的是,Timer类在另一个线程上运行它的任务。 为什么我想在一个线程中执行此操作? run()方法中的代码执行速度非常快,所以我认为我不需要另一个线程。我想要做的是根据每秒计算的条件在run()方法中构造单独的线程。因此,我不想让子线程构建另一个线程,而是想在主线程上执行此操作。

4 个答案:

答案 0 :(得分:3)

您可以使用Handler

执行此操作
public class Job implements Runnable{
    private Handler handler;

    public Job () {
       handler = new Handler(Looper.getMainLooper());
       loop();
    }

    @Override
    public void run() {
        // funky stuff
        loop();
    }

    private void loop() {
        handler.postDelayed(this, 1000);
    }
}

答案 1 :(得分:1)

使用Activity的runOnUiThread(Runnable)方法在UI线程中运行任务

public class LocationCheckerTask extends TimerTask {
    private GeoWatcher watcher;

    public LocationCheckerTask(Context context) {
        watcher = new GeoWatcher(context);
    }

    @Override
    public void run() {
        runOnUiThread(new Runnable() {

            @Override
            public void run() {
                // funky stuff
            }
        });
    }
}

答案 2 :(得分:1)

Handler是完成此类任务的完美选择(不要试图将TimerTask + runOnUiThread结合起来 - 因为它在引擎盖下使用Handler它是无用的)

答案 3 :(得分:0)

private Runnable fiveSecondRunnable = new Runnable() {

    @Override
    public void run() {
        if (count5 < 0) {
            switchT030Sec();
        } else {
            tvSec5.setText(""+count5);
            Log.v("5sec set", "yes");
            count5--;
            man.postDelayed(this, 1000);
        }

    }
};

并通过调用

启动它
man.post(fiveSecondRunnable);