当只有应用程序未最小化时在 android 中轮询

Polling in android when only app is not minimized

假设我有一个每秒打印值的方法 printCount(),我希望在 android 应用程序最小化时停止轮询。例如,如果它在 count = 15 时最小化,如果我在 5 分钟后打开它,它应该恢复轮询并从 16 开始打印计数。当应用程序最小化时,轮询不应该 运行 在后台。

这可以通过多种方式实现,使用 Handler、RxJava、Coroutines 等

  1. 使用 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()
     }
    }
    
  2. 使用 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()
      }
    }