我正在尝试在Flutter中创建后台计时器,该计时器每n秒调用一次。调用AndroidAlarmManager.periodic应该每2秒运行一次printHello函数,但是看起来它是以更大的间隔随机调用的。我在做什么错了?
<main class="py-4">
@yield('content')
</main>
</div>
</body>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
<script src="{{ asset('js/app.js') }}" ></script>
<script type="text/babel" src="{{ asset('js/login.js') }}" ></script>
答案 0 :(得分:0)
您无法通过AlarmManager
频繁安排警报:
注意:从API 19(Build.VERSION_CODES.KITKAT)开始,警报传递是不准确的:操作系统将转移警报,以最大程度地减少唤醒和电池消耗。有一些新的API支持需要严格交付保证的应用程序。请参见setWindow(int,long,long,android.app.PendingIntent)和setExact(int,long,android.app.PendingIntent)。 targetSdkVersion早于API 19的应用程序将继续看到以前的行为,在该行为中,所有警报均在请求时准确地传递。
请参阅:https://developer.android.com/reference/android/app/AlarmManager
答案 1 :(得分:0)
@kashlo,在main()中添加以下代码
void funTimerMain() async {
// A few things that you can do with funTimerMain:
// No 1. Do something you want, e.g.
intCounter += 1; // intCounter is a GLOBAL VARIABLE (Integer), which was initialized to 0
print('intCounter: ' + intCounter.toString());
// No 2. Use the following lines only if you use Redux to manage state
// strCurPage is a GLOBAL VARIABLE (String) that stores which 'page' the user is currently navigating
if (strCurPage == 'PageHome') {
// storeHome is the Redux 'STORE' that keep track of the state of Page Home
// The following line 'Refresh/Re-render' page Home (like a 'setState' in Page Home)
// i.e. you can 'setState' page Home in an external event, like in this timer function
storeHome.dispatch(Actions.Increment);
}
// No 3. Send a message to server every 5 seconds (Instead of 1 second!), using socket.io
// timLastHeartBeat is a Global Variable (Integer) that was initialized to DateTime.now().millisecondsSinceEpoch;
if (DateTime.now().millisecondsSinceEpoch - timLastHeartBeat > 5000) {
socket.emit('HeartBeat', [intCounter]);
timLastHeartBeat = DateTime.now().millisecondsSinceEpoch;
}
// recall this timer every 1 second
new Future.delayed(new Duration(milliseconds: 1000), () async {
funTimerMain();
});
}
// runApp!
runApp(MyApp());
// call the timer for the first time
funTimerMain();
问题1:何时不行。 1、2、3在funTimerMain中运行吗?回答1:当该应用位于前台(即用户使用该应用)或当该应用位于后台时(即用户按下主屏幕按钮或切换到另一个应用)。
问题2:何时不行。 1、2停下来跑?回答2:当该应用被用户或Android系统杀死(例如被节电程序杀死)
问题3:何时不行。 3停下来跑?回答3:与回答2相同,此外,当用户关闭屏幕时。从Android开始? (我忘记了确切的版本),当用户关闭屏幕时,不允许网络访问。
如您所见,funTimerMain每1秒(或x秒)运行一次,但是funTimerMain内部的每个任务可以每y秒运行一次。 (其中y> = x,或者最好是y = Nx,N是整数)
当我第一次使用这项技术时,我以为效率会很糟糕,但是当我在真实的手机中运行该应用程序时,我不会注意到手机的任何延迟。因此,我认为通过设置适当的x和y值,您可以拥有一个响应式应用程序。
您也可以在funTimerMain中使用“ await”,但是请记住,如果“ await之后的功能”没有返回,则计时器将暂停!