我正在添加这个问题,因为我是Java和Android的新手,我搜索了几个小时试图解决这个问题.答案来自相关答案的组合,所以我想我会记录我为其他可能正在努力的人学到的东西.见答案.
对于一些背景知识,我的经验主要是PHP的Web开发和一点Ruby.我唯一的操作系统是Linux(Ubuntu Studio),我(不情愿地)在Android Studio 2.1.2中开发我的第一个Android应用程序.我的Java设置如下:
>java -version
> openjdk version "1.8.0_91"
> OpenJDK Runtime Environment (build 1.8.0_91-8u91-b14-3ubuntu1~15.10.1-b14)
> OpenJDK 64-Bit Server VM (build 25.91-b14, mixed mode)
Run Code Online (Sandbox Code Playgroud) datetime android android-gradle-plugin threetenbp threetenabp
从我的观察来看,滴答之间的android CountDownTimer countDownInterval恰好不准确,countDownInterval通常比指定的时间长几毫秒.我的特定应用程序中的countDownInterval是1000毫秒,只需一秒钟倒计时一定时间.
由于这个延长的滴答声,我最终得到的滴答数减少了当倒计时器运行足够长时间,这会缩短所显示的倒计时时间(当有足够的额外ms总结时,在UI级别上发生2秒的步骤)
查看CountDownTimer的来源似乎可以扭曲它,以便纠正这种不必要的不准确性,但我想知道在java/android世界中是否已经有更好的CountDownTimer可用.
感谢所有指针的好友......
I want to implement timer using Kotlin coroutines, something similar to this implemented with RxJava:
Flowable.interval(0, 5, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.map { LocalDateTime.now() }
.distinctUntilChanged { old, new ->
old.minute == new.minute
}
.subscribe {
setDateTime(it)
}
Run Code Online (Sandbox Code Playgroud)
It will emit LocalDateTime every new minute.
val timer=object:CountDownTimer(Long.MAX_VALUE,10){
override fun onTick(p0: Long) {
_mutableLiveData.postValue(newValue)
}
override fun onFinish() {
TODO("Not yet implemented")
}
}.also { it.start() }
Run Code Online (Sandbox Code Playgroud)
从 a 内部ViewModel否则会导致内存泄漏。另一方面使用实现定时器viewModelScope.launch
viewModelScope.launch {
while (true){
_mutableLiveData.postValue(newValue)
delay(10)
}
}
Run Code Online (Sandbox Code Playgroud)
从内部同样ViewModel浪费资源,因为线程在执行其任务后应该退出而不是进入睡眠状态。
我应该使用哪种方式?
我还错过了其他一些惯用的方式吗?
我的问题的上下文是这样的:在 a 中ViewModel,我的计时器实现(当前使用)定期更改a中正在使用的delay私有状态。MutableLiveDataobserveAsState@Composable
android timer kotlin kotlin-coroutines android-jetpack-compose