- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试编写一个能够与用户输入同步播放 MIDI 文件的音乐应用程序。我已经创建了自定义 View 、播放声音和读取 MIDI 数据。我在 View 的 onDraw() 方法中运行 MIDI 数据的播放,因此我可以将用户输入应用于它。音符数据存储为一组音符音高和播放时间,从一开始就以毫秒为单位进行测量。
我的测试数据每 500 毫秒(半秒)播放一个不同音高的音符。我将 currentThreadTimeMillis() 与每个音符的时间间隔一起记录下来,正如我所期望的那样。每 500 个小变化的滴答声,就会播放一个音符。然而,这个以毫秒为单位的计数大约是真实世界速度的一半,需要一秒钟来计算 500 毫秒!我在 Galaxy Ace 上运行,所以这不是模拟器速度慢的问题。
为什么 SystemClock.currentThreadTimeMillis() 需要两秒钟才能计算 1000 毫秒?
public void onDraw(Canvas canvas) {
// TODO : Draw notes
canvas.drawColor(Color.BLACK);
canvas.drawBitmap(aNote.img, aNote.x, aNote.y, null);
if (ready>0){
elapsed_time = SystemClock.currentThreadTimeMillis() - start_time;
midi_note_data = MIDI.track_data.get(current_note);
if (midi_note_data.start_time <= elapsed_time){
current_note++;
pitch = midi_note_data.pitch;
Log.d("MUSIC", "Note time " + midi_note_data.start_time + " ThreadTime "+ elapsed_time);
sounds.play(tone, 1.0f, 1.0f, 0, 0, notes[pitch]);
}
if (current_note > MIDI.track_data.size()-1){
ready = -2;
}
}else if (ready == 0){
start_time = SystemClock.currentThreadTimeMillis();
Log.d("MUSIC", "Start time "+start_time);
ready = 1;
}
}
最佳答案
您正在使用 SystemClock.currentThreadTimeMillis(),这是当前线程已运行的时间量。在 Android 上,我猜 UI 线程实际上只运行了一半的时间。 (另一半用于操作系统的其余部分!)
切换到 System.currentTimeMillis(),您的问题将得到解决。
您可以阅读有关 different time measuring systems here 的更多信息.
关于android - 为什么 SystemClock.currentThreadTimeMillis() 似乎以半速率运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12022158/
我正在尝试为安卓游戏编写游戏循环,但是,我在尝试访问当前时间时遇到了这个错误(你知道,用于 FPS 管理等) “SystemClock() 在‘android.os.SystemClock’中不公开。
在 View 类中,我重写了 onFinishInflate() 以调用定义了一些监听器的 setupEventHandlers()。例如: setDate.setOnClickListener( n
我希望我的程序等待 1000 毫秒并更改按钮的标题...但是程序以更改后的名称出现 package com.catchthebutton; import android.app.Activity; i
我想让 Toast 出现,然后让 sleep 运行。 如果我这样做,Toast 会在 sleep 后出现,但我希望反过来。有人有建议吗?这是我的代码 switch (checkedRadioButto
Android docs on uptimeMillis()说: Returns milliseconds since boot, not counting time spent in deep sl
我对我从给出的一些答案中检索到的一段代码有一些疑问,这些代码用于避免用户多次单击同一个按钮。有人可以向我解释这部分代码的作用和示例吗? 代码是 private long mLastClickTime
我有一个 android 服务负责更新时钟并在不同时间执行特定任务(如播放歌曲)。我尝试使用 Timer.scheduleAtFixedRate(new MyTask(), 0, 1000L) 之类的
对于 SystemClock.uptimeMillis() 方法,Android 文档说“uptimeMillis() 是从系统启动后以毫秒计算的”。 “自系统启动以来”是什么意思?是按下电源按钮后的
根据 API 文档以及之前的 SO threads , SystemClock.elapsedRealtime() 应该即使在设备处于 sleep 状态时也能保持准确的时间。这不是我观察到的。 我编写
我正在尝试编写一个能够与用户输入同步播放 MIDI 文件的音乐应用程序。我已经创建了自定义 View 、播放声音和读取 MIDI 数据。我在 View 的 onDraw() 方法中运行 MIDI 数据
我的应用程序中有一个 TimePicker,可以选择播放歌曲的时间量,我在使用 CountDownTimer 获取剩余时间以正确显示时遇到问题>我正在使用,当然,一切都在幕后以毫秒为单位进行,我认为我
我需要了解手机的开机时间。为此,我调用了 android.os.SystemClock.uptimeMillis()。但是,这会引发 UnsatisfiedLinkError。关于问题可能是什么的任何
如何从 SystemClock.elapsedRealTime() 转换到可以在 textview 中显示的人类可读的 CharSeq? 最佳答案 tl;博士 Duration.ofMillis(
我正在尝试使用 these instructions 在 dalvikvm 上运行一个简单的命令行 java 应用程序。我以 root 身份运行,所以这不是权限问题。 这是应用程序代码: import
我想在翻转旧图像后的 3 秒内在 ImageView 中显示其他图像。代码: OnClickListener oc = new OnClickListener() { @Override pu
为了同步/排队访问共享资源,我将使用 Semaphore ,在等待循环的帮助下。 为了不遇到 CPU Hook ,我想在 while 循环中稍微sleep()。 我搜索了 http://develop
当尝试显示我的程序的运行时间时,单击按钮后我收到一个非常高的值“119660898”。如果我等待 3 秒并重新单击按钮,总数将按预期增加大约 3 秒。 谁能解释一下为什么初始值这么高?下面是我在按钮中
我想通过这个截屏视频学习 IOC 原理 Inversion of Control from First Principles - Top Gear Style 我尝试按照截屏视频进行操作,但在 Aut
我在 Android 应用程序中模拟 GPS 位置 myMockLocationProvider.pushLocation(37.422, -122.084); 我收到以下错误: java.lang.
我需要保留应用程序启动后的时间。即使设备进入休眠模式,时间也需要保持滴答作响。 在 Android 中,有 SystemClock.ElapsedRealtime() 它在 sleep 时保持滴答作响
我是一名优秀的程序员,十分优秀!