我正在尝试编写一个能够与用户输入同步播放MIDI文件的音乐应用.我已经创建了一个自定义视图,播放声音和读取MIDI数据.我在视图的onDraw()方法中运行MIDI数据的回放,因此可以将用户输入应用于它.音符数据存储为音符音高和演奏时间的数组,从开始算起以毫秒为单位.
我的测试数据每500毫秒(半秒)播放一次不同音调的音符.我在每个音符的时间间隔旁记录了currentThreadTimeMillis(),这与我期望的一样.每500个滴答声稍有变化,便会发出一个音符.但是,这种以毫秒为单位的计数大约是实际速度的一半,需要一秒钟才能计算出500毫秒!我在Galaxy Ace上运行,因此这不是慢模拟器的问题.
SystemClock.currentThreadTimeMillis()为什么花两秒钟来计算1000ms?
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(),您的问题将得到解决.
标签:clock,android,time
来源: https://codeday.me/bug/20191127/2076735.html