我正在开发一个展示不同图片的演示应用。在那里,我想让演示文稿在很短的时间后滑过我的图像列表,视频和pdf文件。
我通过意图startActivityForResult(intent, RESULT_OK);
启动视频和关闭视频不是问题。我使用onPreparedListener
和setOnCompletionListener
,一切都像魅力一样。
我在Thread
中创建了一个新的ImageView
并确实将该帖子放到了sleep()
,之后我调用了setresult()
方法和finish()
。但是没有等待,图片根本没有显示,演示文稿被卡在那里,没有设置结果并完成活动。
所以我开始在android中搜索时间的一些解释并找到了这个解释:
我仔细阅读并尝试了解那里解释的内容。但是我想的越多,我就越不安全,这是实现我预期目的的等待行为的最佳方式。
所以代替一些代码,我更感兴趣的是,你会建议我使用什么,以及如果可能的话,为什么要详细解释。
elapsedRealtime()
?uptimeMillis()
?System.currentTimeMillis()
?答案 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
}
}