Android,如何衡量经过的时间

时间:2013-03-15 14:54:08

标签: android

我正在开发一个展示不同图片的演示应用。在那里,我想让演示文稿在很短的时间后滑过我的图像列表,视频和pdf文件。

我通过意图startActivityForResult(intent, RESULT_OK);

开始我的不同观点

启动视频和关闭视频不是问题。我使用onPreparedListenersetOnCompletionListener,一切都像魅力一样。

然而,有了图片,这完全不同。

我在Thread中创建了一个新的ImageView并确实将该帖子放到了sleep(),之后我调用了setresult()方法和finish()。但是没有等待,图片根本没有显示,演示文稿被卡在那里,没有设置结果并完成活动。

所以我开始在android中搜索时间的一些解释并找到了这个解释:

Explanation

我仔细阅读并尝试了解那里解释的内容。但是我想的越多,我就越不安全,这是实现我预期目的的等待行为的最佳方式。

所以代替一些代码,我更感兴趣的是,你会建议我使用什么,以及如果可能的话,为什么要详细解释。

  1. elapsedRealtime()
  2. uptimeMillis()
  3. System.currentTimeMillis()

4 个答案:

答案 0 :(得分:5)

来自android docs:

  

•System.currentTimeMillis()是表示自纪元以来毫秒的标准“墙”时钟(时间和日期)。挂钟可以由用户或电话网络设置(请参阅setCurrentTimeMillis(long)),因此时间可能会不可预测地向后或向前跳转。只有在与实际日期和时间对应很重要时,例如在日历或闹钟应用程序中,才应使用此时钟。间隔或经过时间测量应使用不同的时钟。如果您使用的是System.currentTimeMillis(),请考虑侦听ACTION_TIME_TICK,ACTION_TIME_CHANGED和ACTION_TIMEZONE_CHANGED Intent广播以查明时间的变化。

     

•自系统启动以来,uptimeMillis()以毫秒为单位计算。当系统进入深度睡眠状态(CPU关闭,显示较暗,设备等待外部输入)时,此时钟停止,但不受时钟缩放,空闲或其他省电机制的影响。这是大多数间隔时间的基础,例如Thread.sleep(millls),Object.wait(millis)和System.nanoTime()。该时钟保证是单调的,当间隔不跨越设备睡眠时,适用于间隔定时。大多数接受时间戳值的方法当前都需要uptimeMillis()时钟。

     

•elapsedRealtime()和elapsedRealtimeNanos()返回自系统启动以来的时间,并包括深度睡眠。该时钟保证是单调的,即使在CPU处于省电模式时也会继续打勾,因此是通用间隔时序的推荐基础。

如果您要测量的时间间隔相对较短,您可以使用几乎任何能够为您提供正确时间的方法。我更喜欢currentTimeMillis()。如果时间间隔非常长,建议的方法是使用elapsedRealtime()。

此外,如果您只想延迟一些事情,只需使用:http://developer.android.com/reference/android/os/Handler.html#postDelayed(java.lang.Runnable,long)。这很简单,效果很好。

答案 1 :(得分:1)

实现这一目标的最简单方法是CountDownTimer

private final class CountDownTimerImpl extends CountDownTimer {
    //5 sec.
    private static final long TIME_INTERVAL = 5000;
    private final ImageView imageView;
    private final List<Drawable> images;

    public CountDownTimerImpl(ImageView imageView, List<Drawable> images) {
        super(TIME_INTERVAL, TIME_INTERVAL);
        this.imageView = imageView;
        this.images = images;

        //set first image from images array to imageView
        imageView.setImageDrawable(images.get(0));
    }       

    //this method is executed after TIME_INTERVAL (5 sec.)
    public void onFinish() {
        //remove drawable from imageView
        imageView.setImageDrawable(null);
        //remove this drawable from array
        images.remove(0);
        //if array is not empty start another count down
        if (!images.isEmpty()) {
            new CountDownTimerImpl(imageView, images).start();
        }
    }

    public void onTick(long millisUntilFinished) {
        //nothing to do here
    }
}

您应该通过以下方式启动此CountDownTimer:

new CountDownTimerImpl(imageView, images).start();

其中images当然是您的演示图像的drawables数组。

我没有时间测试这个解决方案,但它应该有效 - 如果没有请发表评论,我会在以后更新。

答案 2 :(得分:0)

您可以使用TimerTask

int counter=0;   
final Handler handler = new Handler();
Timer ourtimer = new Timer();
TimerTask timerTask = new TimerTask() {
      public void run() {
              handler.post(new Runnable() {
                      public void run() {
counter++;
              //you can do stuffs here say  like if (counter==15) { do something}


                      }
             });
      }};


ourtimer.schedule(timerTask, 0, 1000);

答案 3 :(得分:0)

您可以通过编写回调模块的其他方式执行此操作

创建一个活动,将其称为BaseActivity,并让所有活动对其进行扩展 现在声明方法调用是void callback(){}保持正文

现在在onCreate中创建一个如上所示的计时器并调用你的代码看起来像

的回调函数
onCreate(){
final Handler handler = new Handler();
Timer callTimer = new Timer();
TimerTask timerTask = new TimerTask() {
      public void run() {
              handler.post(new Runnable() {
                      public void run() {
            callback();


                      }
             });
      }};


callTimer.schedule(timerTask, 0, 1000);
}

现在你的活动覆盖了在你在计时器中指定的时间之后调用的回调方法

实施例

Class a extends BaseActivity(){

@Override 
 onCreate(){
// playVideo
}

@Override 

void onCallBack(){
 //navigate to another activity
}

}