我有一项活动,我必须每秒更新一次视图(如图像)。我尝试了几种不同的方法,我发现它们实现了同样的东西。但哪种方法最有效并减少内存泄漏?
以下是不同的方法 -
方法1
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
//DO SOMETHING
handler.postDelayed(this, 1000);
}
}, 1000);
方法2
ScheduledExecutorService scheduleTaskExecutor = Executors.newScheduledThreadPool(5);
scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
public void run() {
//DO SOMETHING
}
}, 0, 1, TimeUnit.SECONDS);
方法3
Timer myTimer = new Timer();
myTimer.schedule(new TimerTask() {
@Override
public void run() {
//DO SOMETHING
}
}, 0, 1000);
我应该使用哪一个?我问这个问题是因为我在很短的时间内更新了我的GUI。
答案 0 :(得分:3)
如果要更新屏幕上的值或图像,则应使用第一种方法。我使用第一种方法解决了同样的问题。
方法1
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
//DO SOMETHING
handler.postDelayed(this, 1000);
}
}, 1000);
<强>替代强>
Thread t = new Thread() {
@Override
public void run() {
try {
while (!isInterrupted()) {
Thread.sleep(1000);
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
//update here (images or other values)
}
});
}
} catch (InterruptedException e) {
}
}
};
答案 1 :(得分:1)
考虑到Android使用它自己的java实现的事实。
Android平台中没有Java虚拟机。 Java的 字节码未执行。相反,Java类被编译成一个 专有的字节码格式,在Dalvik上运行,这是一个专门的虚拟机 机器(VM)专为Android设计。与Java VM不同 堆栈机器,Dalvik VM是基于寄存器的架构。
Comparison of Java and Android API
因此,对于java虚拟机而言,这一点可能不一定反映在Android的实现上。
根据规则,最好使用Android API提供的任何内容。
我建议使用处理程序。 特别是如果您想要更新视图。
即使official Android tutorials 建议:
要将数据从后台线程移动到UI线程,请使用Handler 那个在UI线程上运行。
从一开始计时器被排除。
使用Timer有一些缺点它只创建一个 线程执行任务,如果任务需要太长时间才能运行,其他 任务受苦。它不处理任务和线程抛出的异常 只是终止,这会影响其他计划任务,它们是 从不运行
来自this answer。
来自Android docs:
当需要多个工作线程时,或者当需要多个工作线程时,ThreadPoolExecutor(即ScheduledThreadPoolExecutor)优于Timer ThreadPoolExecutor的额外灵活性或功能 (这个类扩展)是必需的。
使用处理程序时,如果您想避免内存泄漏,我建议您阅读this tutorial 。
如果不是UI更新的情况,则ThreadPoolExecutor会更好because,因为减少了每个任务的调用开销,它们在执行大量异步任务时提供了更高的性能。