假设我有一个printCount()
每秒打印值的方法,我希望在最小化 android 应用程序时停止轮询。例如,如果它在 count = 15 时最小化并且如果我在 5 分钟后打开它,它应该恢复轮询并从 16 打印计数。当应用程序最小化时,轮询不应该在后台运行。
- 在android中实现这一目标的最简单和最好的方法是什么?
- 还有一种 RxJava 方法来实现这一点吗?
假设我有一个printCount()
每秒打印值的方法,我希望在最小化 android 应用程序时停止轮询。例如,如果它在 count = 15 时最小化并且如果我在 5 分钟后打开它,它应该恢复轮询并从 16 打印计数。当应用程序最小化时,轮询不应该在后台运行。
这可以通过多种方式实现,使用 Handler、RxJava、协程等。
使用 RxJava:
Observable.interval() 方法,在指定的特定时间间隔后发出。
当应用程序被最小化时,onStop() 方法被调用,observable 通过调用disposable?.dispose() 停止发射,并在onStart() 中重新开始。我使用全局变量来维护计数。
class MainActivity : AppCompatActivity() {
private lateinit var counterText: TextView
private var counter: Int = 0
private var disposable: Disposable? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
counterText = findViewById(R.id.count)
}
override fun onStart() {
super.onStart()
disposable = Observable.interval(1000, TimeUnit.MILLISECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe { printCount() }
}
private fun printCount() {
counter++
counterText.text = counter.toString()
}
override fun onStop() {
super.onStop()
disposable?.dispose()
}
}
使用 Kotlin 协程:
class MainActivity : AppCompatActivity() {
private lateinit var counterText: TextView
private var counter: Int = 0
private var job: Job? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
counterText = findViewById(R.id.count)
}
override fun onStart() {
super.onStart()
job = CoroutineScope(Job() + Dispatchers.Main).launch {
while (true) {
printCount()
delay(1000)
}
}
}
private fun printCount() {
counter++
counterText.text = counter.toString()
}
override fun onStop() {
super.onStop()
job?.cancel()
}
}