Запустите метод в указанное время c без повторения - PullRequest
0 голосов
/ 31 марта 2020

Мне нужно вызвать веб-API в указанное время c, не повторяя его. Я использую AlarmManager, но он никогда не срабатывал. Я также реализую handler.postDelayed, но это повторяется. Я не знаю, как реализовать это правильно.

это мой alarmManager:

 alarmManager = (getCTX()?.getSystemService(Context.ALARM_SERVICE)) as (AlarmManager)

        var intent: Intent = Intent(getCTX(), NextLiveReceiver::class.java)


        intent.putExtra("next", next)
        intent.putExtra("curTime", curTime)

        myPendingIntent =
            PendingIntent.getBroadcast(
                getCTX(),
                0,//next.toInt(),
                intent,
                0
            )

        var ALARM_TYPE = AlarmManager.RTC_WAKEUP

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
            alarmManager.setExactAndAllowWhileIdle(ALARM_TYPE, next, myPendingIntent);
        else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT)
            alarmManager.setExact(ALARM_TYPE, next, myPendingIntent);
        else
            alarmManager.set(ALARM_TYPE, next, myPendingIntent)

это AlarmManagerReceiver:

class NextLiveReceiver : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {

            var next: Long = intent.getLongExtra("next", 0)
            var current: Long = intent.getLongExtra("curTime", 0)

            if (next > 0 && current > 0) {

                EventBus.send(NextEvent(true, next, current))
            }

    }
}

и это мой обработчик:

 var handler: Handler = Handler()
        handler.postDelayed({

            viewModel.fetchLiveInfo(viewModel.currentChannelId.value!!, next, 0)
        }, delay)

        handler.removeCallbacks(null)

1 Ответ

0 голосов
/ 01 апреля 2020

WorkManager, Handler и AlarmManager не работали, как я ожидал. Итак, я решил это с Kotlin задержкой таким образом:

  runBlocking {
                                scope.launch(Dispatchers.Main + handler) {
                                    Timber.i("--Launch-- start : ${getUnixTime()}")
                                    delay(delayTime)

                                    removeRate()
                                    refetchLiveInfo(channelId, liveInfoResult[0].next, 1)
                                    Timber.i("--Launch-- ended : ${getUnixTime()}")
                                }

                            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...