如何在Android中获得时差?

时间:2014-08-02 08:41:59

标签: java android date

我正在设计秒表,对于我的应用程序,我需要不断获得这个时刻和秒表开始的时刻之间的时差。

这就是我所拥有的

private int timestamp;

private Date startTime;

public void start() {

        if (!working) {

            startTime = new Date();
            working = true;

            tick = new Thread() {
                public void run() {
                    while (true) {
                        try {
                            timestamp = (new Date().getDate() - startTime.getDate())/1000;
                            msg = handler.obtainMessage(0, getTimeStamp());
                            handler.sendMessage(msg);
                        } catch (InterruptedException ex) {
                            ex.printStackTrace();
                            working = false;
                            timestamp = 0;
                            break;
                        }
                    }
                }
            };

            tick.start();
        }
    }

但是我收到了一条不推荐使用getDate()方法的消息。怎么重构呢?我已经搜索了一个解决方案,并找到了一些类似的帖子,并尝试了解决方案,但我的IDE只是不识别DateUtil,DateTime或toCalendar Methods,我想我错过了正确的库? 还有一个问题,你能不能给我一些关于这些方法被弃用的具体含义的信息?这对我来说不是很清楚。 提前谢谢。

3 个答案:

答案 0 :(得分:2)

重构此代码的一种方法是使用SystemClock.uptimeMillis(),如果您的时钟没有足够的时间让设备进入休眠状态。或者,当它确实超过睡眠时间时,您可以使用SystemClock.elapsedRealtime()。两个时钟都是单调的,谷歌建议将它们用于间隔时间。

你可以这样试试:

startTime = SystemClock.elapsedRealtime(); //Should be a long, not an int
working = true;

tick = new Thread() {
    public void run() {
        while (true) {
            try {
                timestamp = (SystemClock.elapsedRealtime() - startTime)/1000;
                msg = handler.obtainMessage(0, getTimeStamp());
                handler.sendMessage(msg);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
                working = false;
                timestamp = 0L
                break;
            }
        }
    }
};

但请记住,作为在java和Android中使用时间的任何东西,如果手机用户改变他的时钟,所有这些值都会发生变化,所以如果你想要一个更强大的解决方案,我建议这篇文章:http://julien-millau.fr/articles/Secure-Android-time-based-application.html

答案 1 :(得分:1)

对于你正在做的事情,getDate会正常工作。但更多的Android方法是使用System.currentTimeMillis()而不是生成Date对象以及那里的所有效率低下。

不推荐使用基本上意味着它不再是图书馆作者所建议的做事方式。这并不意味着它不会起作用,或者你永远不应该使用它 - 这意味着你应该理解作者感觉有更好的方法,你应该有理由使用不赞成的方式

答案 2 :(得分:0)

有一天,也可以从API中完全删除已弃用的方法,因此最好使用较新的技术来解决兼容性问题。