我有一个类似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中的内存?
所以我想知道是否有任何想法来解决它?
答案 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
}
}
}