android - Android 警报管理器崩溃 Flutter 应用程序 - 运行时异常、线程/异步问题
问题描述
调用时:
await AndroidAlarmManager.oneShot(Duration(seconds: 1), 17, callback)
在我的计时器类中,具有如下回调函数:
static void alarmCallback(){
print('>>>>>>>>>>>>>>>>>>>> ALARM CALLBACK <<<<<<<<<<<<<<<<< ');
}
我收到错误:
E/AndroidRuntime( 9115): FATAL EXCEPTION: AsyncTask #2
E/AndroidRuntime( 9115): Process: com.myapp, PID: 9115
E/AndroidRuntime( 9115): java.lang.RuntimeException: An error occurred while executing doInBackground()
E/AndroidRuntime( 9115): at android.os.AsyncTask$3.done(AsyncTask.java:354)
E/AndroidRuntime( 9115): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
E/AndroidRuntime( 9115): at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
E/AndroidRuntime( 9115): at java.util.concurrent.FutureTask.run(FutureTask.java:271)
E/AndroidRuntime( 9115): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167)
E/AndroidRuntime( 9115): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
E/AndroidRuntime( 9115): at java.lang.Thread.run(Thread.java:764)
E/AndroidRuntime( 9115): Caused by: java.lang.RuntimeException: Methods marked with @UiThread must be executed on the main thread. Current thread: AsyncTask #2
E/AndroidRuntime( 9115): at io.flutter.embedding.engine.FlutterJNI.ensureRunningOnMainThread(FlutterJNI.java:794)
E/AndroidRuntime( 9115): at io.flutter.embedding.engine.FlutterJNI.dispatchPlatformMessage(FlutterJNI.java:684)
E/AndroidRuntime( 9115): at io.flutter.embedding.engine.dart.DartMessenger.send(DartMessenger.java:80)
E/AndroidRuntime( 9115): at io.flutter.embedding.engine.dart.DartExecutor.send(DartExecutor.java:189)
E/AndroidRuntime( 9115): at io.flutter.view.FlutterNativeView.send(FlutterNativeView.java:155)
E/AndroidRuntime( 9115): at io.flutter.plugin.common.MethodChannel.invokeMethod(MethodChannel.java:98)
E/AndroidRuntime( 9115): at io.flutter.plugin.common.MethodChannel.invokeMethod(MethodChannel.java:84)
E/AndroidRuntime( 9115): at io.flutter.plugins.androidalarmmanager.AlarmService.invokeCallbackDispatcher(AlarmService.java:170)
E/AndroidRuntime( 9115): at io.flutter.plugins.androidalarmmanager.AlarmService.onHandleWork(AlarmService.java:151)
E/AndroidRuntime( 9115): at androidx.core.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:392)
E/AndroidRuntime( 9115): at androidx.core.app.JobIntentService$CommandProcessor.doInBackground(JobIntentService.java:383)
E/AndroidRuntime( 9115): at android.os.AsyncTask$2.call(AsyncTask.java:333)
E/AndroidRuntime( 9115): at java.util.concurrent.FutureTask.run(FutureTask.java:266)
E/AndroidRuntime( 9115): ... 3 more
D/ViewRootImpl@c3ee092[MainActivity]( 9115): MSG_WINDOW_FOCUS_CHANGED 0 1
D/InputMethodManager( 9115): prepareNavigationBarInfo() DecorView@360043a[MainActivity]
D/InputMethodManager( 9115): getNavigationBarColor() -855310
I/Process ( 9115): Sending signal. PID: 9115 SIG: 9
Lost connection to device.
我在https://pub.dev/packages/android_alarm_manager的官方文档中实现了 android_alarm_manager
- 添加了权限、服务和接收到清单
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.WAKE_LOCK" />
<service
android:name="io.flutter.plugins.androidalarmmanager.AlarmService"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="false"/>
<receiver
android:name="io.flutter.plugins.androidalarmmanager.AlarmBroadcastReceiver"
android:exported="false"/>
<receiver
android:name="io.flutter.plugins.androidalarmmanager.RebootBroadcastReceiver"
android:enabled="false">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
- 等待 AndroidAlarmManager.initialize(); 应用程序正在午餐时调用
- PluginRegistrant 使用新类完成(与清单中的应用名称相同)
<application
android:name=".Application"
public class Application extends FlutterApplication implements PluginRegistrantCallback {
@Override
public void onCreate() {
super.onCreate();
AlarmService.setPluginRegistrant(this);
}
@Override
public void registerWith(PluginRegistry registry) {
GeneratedPluginRegistrant.registerWith(registry);
}
}
警报已经初始化 - 在调用 oneShot() 之前:
I/AlarmService( 9115): Starting AlarmService...
I/AlarmService( 9115): AlarmService started!
我已经在寻找那个错误,例如这里:
或在这里:
解决方案
推荐阅读
- c - 如何在uart中读取数据并同时执行一个循环?
- r - 检查字符串中的多个条件并返回二进制指示符
- julia - 在 Julia 1.0.1 中安装软件包时出现解析器错误
- php - 使用php在数组中查找每个父母的最深的孩子
- winforms - 在 PropertyGrid 中显示未更改属性的占位符文本
- julia - 如何在 Julia 中读取记录格式 json?
- android - 未连接适配器;当我尝试从 Firebase 数据库中获取图像时跳过布局
- laravel - 如何使用 Laravel Passport 驱动程序保护登录用户?
- html - 使用 XSLT 填充垂直列数据
- apache-spark - 我可以获取 Spark 读取的文件的元数据吗