Attempt to update UI in non-UI thread.
不管鸿蒙还是安卓都要求在UI线程更新UI相关组件,在相关项目时使用TaskDispatcher执行识别任务,并识别出结果
TaskDispatcher taskDispatcher = getGlobalTaskDispatcher(TaskPriority.DEFAULT);taskDispatcher.syncDispatch(() -> {//获取识别结果ArrayList results = mPredictor.recognize("person");//之后在Layout上绘制识别结果rootContainer.addDrawTask(new Component.DrawTask() {//在此处会报一下错误,见下表 @Override public void onDraw(Component component, Canvas canvas) { //省略一部分代码... canvas.drawRect(location.left, location.top, location.right, location.bottom, rectPaint); }});}
由于没有在UI线程更新代码报错如下
E AndroidRuntime: FATAL EXCEPTION: PoolThread-16 E AndroidRuntime: Process: com.wincent.harmonybot, PID: 12921 E AndroidRuntime: java.lang.IllegalStateException: Attempt to update UI in non-UI thread. E AndroidRuntime: at ohos.agp.components.Component.nativeAddDrawTaskOverContent(Native Method) E AndroidRuntime: at ohos.agp.components.Component.addDrawTask(Component.java:1042) E AndroidRuntime: at ohos.agp.components.Component.addDrawTask(Component.java:1012) E AndroidRuntime: at com.wincent.harmonybot.slice.TestCameraAbilitySlice.drawRecognition(TestCameraAbilitySlice.java:205) E AndroidRuntime: at com.wincent.harmonybot.slice.TestCameraAbilitySlice.lambda$proccessImage$1$TestCameraAbilitySlice(TestCameraAbilitySlice.java:174) E AndroidRuntime: at com.wincent.harmonybot.slice.-$$Lambda$TestCameraAbilitySlice$EZchKR0f-M1PI3llKrX_W4R5GhQ.run(Unknown Source:4) E AndroidRuntime: at ohos.app.dispatcher.task.Task.run(Task.java:71) E AndroidRuntime: at ohos.app.dispatcher.task.SyncTask.run(SyncTask.java:44) E AndroidRuntime: at ohos.app.dispatcher.TaskExecutor.doWorks(TaskExecutor.java:172) E AndroidRuntime: at ohos.app.dispatcher.threading.WorkerThread.run(WorkerThread.java:63) E AndroidRuntime: at java.lang.Thread.run(Thread.java:929)
正确方法应该是使用
getUITaskDispatcher().asyncDispatch(() -> {
rootContainer.addDrawTask(...);
}