当只有应用程序未最小化时在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 中实现这一目标的最简单和最好的方法是什么? 还有 RxJava 方法来实现这一点吗?

【问题讨论】:

"在 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 轮询错误

在 primefaces 数据表中,轮询未保留排序和过滤

如何在使用 Chaquopy 时在 android 中显示加载动画

Pjsip 在多线程中调用它的函数时在 android 上崩溃

Android Fragment,视图未删除