【发布时间】:2017-11-16 23:20:43
【问题描述】:
我反复拨打ToneGenerator.startTone() 以发出短促的声音。但是在第一次调用时,它会阻塞很长时间。所以第一次爆发太长了。这是一个例子:
成员变量:
private ToneGenerator mDTMFPlayer
在构造函数中:
mDTMFPlayer = new ToneGenerator(AudioManager.STREAM_VOICE_CALL, TONE_RELATIVE_VOLUME);
在OnClickListener.onClick() 发起的Thread 中:
long startTime = System.currentTimeMillis();
mDTMFPlayer.startTone(ToneGenerator.TONE_DTMF_0);
Log.d(TAG,"After 1st: " + (System.currentTimeMillis() - startTime));
try { Thread.sleep(160); } catch (InterruptedException e) { }
mDTMFPlayer.stopTone();
startTime = System.currentTimeMillis();
mDTMFPlayer.startTone(ToneGenerator.TONE_DTMF_0);
Log.d(TAG,"After 2nd: " + (System.currentTimeMillis() - startTime));
try { Thread.sleep(160); } catch (InterruptedException e) { }
mDTMFPlayer.stopTone();
startTime = System.currentTimeMillis();
mDTMFPlayer.startTone(ToneGenerator.TONE_DTMF_0);
Log.d(TAG,"After 3rd: " + (System.currentTimeMillis() - startTime));
try { Thread.sleep(160); } catch (InterruptedException e) { }
mDTMFPlayer.stopTone();
这是输出,执行时间为startTone(),以毫秒为单位:
11-16 18:07:35.885 16927-17977/com.my.project D/Ring: After 1st: 454
11-16 18:07:36.502 16927-17977/com.my.project D/Ring: After 2nd: 0
11-16 18:07:36.672 16927-17977/com.my.project D/Ring: After 3rd: 1
第一个电话阻塞了将近半秒,这对于我的需要来说太长了。之后的任何调用都会使阻塞消失一段时间。奇怪的是,如果我稍等片刻再试一次,它又变慢了。似乎有一段时间后阻塞又回来了。
请指教。
【问题讨论】:
-
“一点”有多长? IOW,这是每个进程的问题吗?“一点”是在您的进程终止并通过用户操作重新创建之后?
-
不,过程继续,我等待不到一秒钟,然后我再次单击调用 onClick() 的按钮并启动一个单独的线程(我不想在 GUI 上阻塞thread) 并再次调用 startTone()。
-
好吧,
startTone()只是调用了一个native方法(请参阅the source),所以我不确定您能做些什么。 -
如果不是原生的,我可能已经找到原因了。 :)
-
点。抱歉,如果我的评论另有暗示 - 无论如何,如果您没有得到答案,我的评论是为了让下一个人遇到这个问题。
标签: java android performance tone-generator