运行特定时间不重复的方法
Run a method at a specific time without repeat
我需要在特定时间调用网络API,不再重复。我使用 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)
WorkManager、Handler 和 AlarmManager 未按预期运行。所以,我用 Kotlin delay 以这种方式解决了它:
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()}")
}
}
我需要在特定时间调用网络API,不再重复。我使用 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)
WorkManager、Handler 和 AlarmManager 未按预期运行。所以,我用 Kotlin delay 以这种方式解决了它:
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()}")
}
}