我正在尝试编写一个能够与用户输入同步播放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(),您的问题将得到解决.
您可以阅读有关different time measuring systems here的更多信息.
总结以上是内存溢出为你收集整理的android-为什么SystemClock.currentThreadTimeMillis()似乎以一半速度运行?全部内容,希望文章能够帮你解决android-为什么SystemClock.currentThreadTimeMillis()似乎以一半速度运行?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)