当只有应用程序未最小化时在 android 中轮询
Polling in android when only app is not minimized
假设我有一个每秒打印值的方法 printCount()
,我希望在 android 应用程序最小化时停止轮询。例如,如果它在 count = 15 时最小化,如果我在 5 分钟后打开它,它应该恢复轮询并从 16 开始打印计数。当应用程序最小化时,轮询不应该 运行 在后台。
- 在 android 中实现此目标的最简单和最佳方法是什么?
- 还有 RxJava 方法可以实现这个吗?
这可以通过多种方式实现,使用 Handler、RxJava、Coroutines 等
使用 RxJava:
Observable.interval() 方法,在指定的特定时间间隔后发出。
当应用程序最小化时,onStop() 方法被调用,可观察对象通过调用 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()
}
}
假设我有一个每秒打印值的方法 printCount()
,我希望在 android 应用程序最小化时停止轮询。例如,如果它在 count = 15 时最小化,如果我在 5 分钟后打开它,它应该恢复轮询并从 16 开始打印计数。当应用程序最小化时,轮询不应该 运行 在后台。
- 在 android 中实现此目标的最简单和最佳方法是什么?
- 还有 RxJava 方法可以实现这个吗?
这可以通过多种方式实现,使用 Handler、RxJava、Coroutines 等
使用 RxJava:
Observable.interval() 方法,在指定的特定时间间隔后发出。
当应用程序最小化时,onStop() 方法被调用,可观察对象通过调用 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() } }