在短时间间隔内重复方法

时间:2015-05-30 12:52:04

标签: java android performance time

我有一项活动,我必须每秒更新一次视图(如图像)。我尝试了几种不同的方法,我发现它们实现了同样的东西。但哪种方法最有效并减少内存泄漏?

以下是不同的方法 -

方法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。

2 个答案:

答案 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,因为减少了每个任务的调用开销,它们在执行大量异步任务时提供了更高的性能。