当只有应用程序未最小化时在android中进行轮询
Posted
技术标签:
【中文标题】当只有应用程序未最小化时在android中进行轮询【英文标题】:Polling in android when only app is not minimized 【发布时间】:2021-10-11 07:44:48 【问题描述】:假设我有一个方法printCount()
每秒打印一次值,我希望在最小化 android 应用程序时停止轮询。例如,如果它在 count = 15 时最小化并且如果我在 5 分钟后打开它,它应该恢复轮询并从 16 打印计数。当应用程序最小化时,轮询不应该在后台运行。
【问题讨论】:
"在 android 中实现这一目标的最简单和最好的方法是什么?" ——究竟是什么?如果“this”是“我如何确定应用何时被‘最小化’?”,请使用ProcessLifecycleOwner
。
【参考方案1】:
这可以通过多种方式实现,使用 Handler、RxJava、Coroutines 等。
使用 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()
【讨论】:
非常感谢。这正是我想要的。您还知道使用暂停/恢复方法和使用 ProcessLifecycleOwner 的区别吗?使用 ProcessLifecycleOwner,我得到 700 毫秒的延迟。我可以用你的方法解决这个问题吗?如果在最小化和恢复之前有一些东西会触发,那就太好了以上是关于当只有应用程序未最小化时在android中进行轮询的主要内容,如果未能解决你的问题,请参考以下文章
当广告加载失败时在 Swift 中隐藏 iAd ADBannerView - 没有委托或委托未实现 didFailToReceiveAdWithError
在 android 上使用 Socket.IO 总是返回 XHR 轮询错误
如何在使用 Chaquopy 时在 android 中显示加载动画