如何在延迟一段时间后执行某种方法?

时间:2014-03-31 08:57:58

标签: java android

我有一个类似Render的课程:

public class Render {
    private Timer timer;
    private TimerTask timerTask;


    @Override
    public void refresh() {
        if (timerTask != null)
            timerTask.cancel();
        timerTask = new LoadTask();
        timer.schedule(timerTask, 1000);
    }

    private class LoadTask extends TimerTask {
        @Override
        public void run() {
            //request the server
        }
    }
}

可能会非常频繁地调用refresh方法,但是要在refresh内完成的工作有点重,它必须从服务器请求一些东西,所以我试图制作这个方法延迟后执行。

但如图所示,一旦调用此方法,将创建一个新的LoadTask实例,这是否浪费了android中的内存?

所以我想知道是否有任何想法来解决它?

3 个答案:

答案 0 :(得分:2)

您将尝试使用延迟执行此任务

    Handler handler = new Handler();
            handler.postDelayed(new Runnable() {

                @Override
                public void run() {
                //Your task it will execute at 1 time only...

                }
            }, 5000);//5 seconds delay and you can change the delay  time...

它将在10秒内执行线程,就像循环函数一样......

Timer timer = new Timer();
        timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                //Your logic it will repeating you task ever 10 seconds....

            }
        }, 5000, 5000);

答案 1 :(得分:0)

为什么不在Render Class的构造函数中初始化TimerTask。喜欢这个

public class Render {
    private Timer timer;
    private TimerTask timerTask;

    public Render()
    {
        timerTask = new LoadTask();         
    }

    //....

}

然后在Refresh函数中使用引用。这应该可以解决你的问题:)

答案 2 :(得分:0)

您可以使用java Executors, included in version 7。您重用了线程实例和LoadTask实例。

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

public class Render {

    private final LoadTask yourDelayedTask;
    private ScheduledExecutorService scheduler;
    private static final long DELAY_MS = 1000;

    public Render() {
        scheduler = Executors.newScheduledThreadPool(1);
        yourDelayedTask = new LoadTask();
    }

    private ScheduledFuture<?> lastScheduledTask;

    public void refresh() {
        if (lastScheduledTask != null && !lastScheduledTask.isCancelled() || !lastScheduledTask.isDone()) { // Review this logic
            lastScheduledTask.cancel(true);
        }
        lastScheduledTask = scheduler.schedule(yourDelayedTask, DELAY_MS, TimeUnit.MILLISECONDS);

    }

    private class LoadTask implements Runnable {
        @Override
        public void run() {
            // request the server
        }
    }
}