0

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

  • 在android中实现这一目标的最简单和最好的方法是什么?
  • 还有一种 RxJava 方法来实现这一点吗?
4

1 回答 1

1

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

  1. 使用 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()
     }
    }
    
  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()
      }
    }
    
于 2021-08-08T18:14:03.217 回答