Как остановить обработчик и его работоспособность при запуске через Apply{}

#android #kotlin #apply

#Android #kotlin #применить

Вопрос:

Я создал следующую функцию для генерации события обработчика каждые 15 секунд. Он начинается с заданного флага, когда я передаю False, я хочу, чтобы обработчик остановил свой цикл. Вот мой фрагмент кода в Kotlin:

 private fun getSalesData(session:Boolean,delayMs:Long,salesRequest: JsonObjectRequest){
        lateinit var runnable: Runnable
        if (session) {
            HttpRequestSingleton.getInstance(this@NavBarActivity).addToRequestQueue(salesRequest)
        }
        Handler().apply {
            runnable = object : Runnable {
                override fun run() {
                    HttpRequestSingleton.getInstance(this@NavBarActivity).addToRequestQueue(salesRequest)
                    Log.d(TAG, "se esta repitiendo cada 15 segs mamahuevo")
                    postDelayed(this, delayMs)
                }
            }
            postDelayed(runnable, delayMs)
            if (!session){
                Log.d(TAG,"entre aca como todo un crack")
                Handler().removeCallbacksAndMessages(runnable)
            }
        }
        if(!session){
            Log.d(TAG,"aanopqwwwwww")
            Handler().removeCallbacksAndMessages(runnable)
        }
    }
  

Ответ №1:

Немного сложно понять, что именно вы хотите сделать, но вот возможное решение:

 private fun getSalesData(session:Boolean,delayMs:Long,salesRequest: JsonObjectRequest){
        lateinit var runnable: Runnable
        if (session) {
            HttpRequestSingleton.getInstance(this@NavBarActivity).addToRequestQueue(salesRequest)
        }
        Handler().apply {
            runnable = object : Runnable {
                override fun run() {
                    HttpRequestSingleton.getInstance(this@NavBarActivity).addToRequestQueue(salesRequest)
                    Log.d(TAG, "se esta repitiendo cada 15 segs mamahuevo")
                    postDelayed(this, delayMs)
                }
            }
            postDelayed(runnable, delayMs)
            if (!session){
                Log.d(TAG,"entre aca como todo un crack")
                removeCallbacks(runnable) // just call this method, as part of your handler object 
            }
        }
        if(!session){
            Log.d(TAG,"aanopqwwwwww")
            removeCallbacks(runnable)// just call this method, as part of your handler object 
        }
    }
  

Обновление: Извините, не видел, что вы использовали removeCallbacksAndMessages . removeCallbacks удалит все выполняемые файлы в очереди

Комментарии:

1. Да, я пытался использовать removeCallbacks, но он не работает. Я предполагаю, что для вызова с помощью экземпляра apply{} нужен особый способ. Я не знаю, что я делаю не так.

2. Не используйте Handler(). перед вызовом этого метода в apply{}