> 文档中心 > Attempt to update UI in non-UI thread.

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(...);

}