如何衡量一个条件的真实时间?

时间:2018-03-31 15:44:09

标签: java android

我正在为音乐家制作练习应用程序。我在 WebView 中显示音乐表和光标(突出显示注释)。当播放突出显示的音符时,我已设法让光标移动到下一个音符。对此的解决方案基本上是不断检查:

if(payedNote == highlightedNote){
    cursor.next();
}

但是,我想将音乐的时间组件实现到此活动中。 我的思维过程是,实现这一目标的最简单方法是测量音符的播放时间,并在经过一段时间后移动光标。

我现在的问题是:
是否可以检查这种情况已经存在多长时间,如果没有,是否有针对这种情况的解决方法?

3 个答案:

答案 0 :(得分:1)

你可以使用一个线程,它基本上会在后台运行,直到你告诉它停止,即线程将是一个监听器。所以在你的主题中你会得到时间:

  public void start()
    {
        super.start();
        timeStarted = System.currentTimeMillis();
    }

然后当你停止线程时,你会再次得到时间,并找到两者之间的差异。

如果您想等待播放音符,可以使用thread.wait()

我希望这会有所帮助。

答案 1 :(得分:0)

获取条件变为true时的当前时间。当它变为false时,再次获取当前时间并计算差值

long startTime;
long stopTime;
wasFalse = true

if(payedNote == highlightedNote) {
    cursor.next();
    if (wasFalse) {
        startTime = System.currentTimeMillis();
    }
    wasFalse = false;
} else {
    stopTime = System.currentTimeMillis();
}
System.out.println("Elapsed time was " + (stopTime - startTime) + " miliseconds");

答案 2 :(得分:0)

您可以使用RxAndroid来观察变量,

1-首先创建observable并保存开始时间

  Observable<Boolean> mObservable = Observable.just(payedNote == highlightedNote); 
long startTime = System.currentTimeMillis();

2-订阅观察员

    mObservable.map(new Func1<Boolean, Object>() {

        @Override
        public Object call(Boolean aBoolean) {


            long stopTime = System.currentTimeMillis();
            long elapsedTime = stopTime - startTime;


            Log.d("ELAPSED", String.valueOf(elapsedTime));
            return true;
        }
    });

最后当变量变为false时 致电mObservable.onNext(false)

 if (payedNote == highlightedNote)
    {
        cursor.next();
    } else {
        mObservavle.onNext(false);
    }

RxAndroid Gradle依赖

implementation 'io.reactivex.rxjava2:rxandroid:2.0.2'
implementation 'io.reactivex.rxjava2:rxjava:2.x.x'