1

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

我从意图开始我的不同观点,startActivityForResult(intent, RESULT_OK);

开始视频和关闭视频不是问题。我用过onPreparedListenersetOnCompletionListener一切都像一个魅力。

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

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

所以我开始在android中搜索一些时间的解释,发现了这个解释:

解释

我通读了一遍,试图很好地理解那里的解释。但是我想得越多,我就越不安全,这是为我的预期目的实现等待行为的最佳方式。

因此,我更感兴趣的不是一些代码,而是你会建议我使用什么以及为什么使用一个(如果可能的话)详细的解释。

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

4 回答 4

5

来自安卓文档:

• 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) 。它很简单,效果很好。

于 2013-03-15T15:08:42.900 回答
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数组在哪里。

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

于 2013-03-15T17:26:27.187 回答
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);
于 2013-03-15T15:07:43.223 回答
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
}

}
于 2013-03-15T15:51:58.140 回答