如何在Harmony中使用线程运行后台任务及EventHandler简单示例
HarmonyOS EventHandler 最简使用示例
以下示例可实现类似Android AsyncTask的「子线程执行耗时任务+主线程更新UI」的通信逻辑,适用于绝大多数后台任务开发场景。
1. 核心逻辑说明
EventHandler通过绑定EventRunner(线程的事件循环器)实现线程间通信:
- 绑定UI线程的EventRunner:处理逻辑运行在主线程,可直接操作UI组件
- 绑定自定义子线程的EventRunner:处理逻辑运行在异步线程,可执行耗时操作
2. 完整代码示例(Java FA模型)
场景:点击按钮触发后台文件下载,下载完成后更新UI显示结果
import ohos.aafwk.ability.Ability; import ohos.aafwk.content.Intent; import ohos.eventhandler.EventHandler; import ohos.eventhandler.EventRunner; import ohos.eventhandler.InnerEvent; import ohos.agp.components.Button; import ohos.agp.components.Text; public class MainAbility extends Ability { // 绑定UI线程的EventHandler,用于更新界面 private EventHandler uiHandler; private Text resultText; @Override public void onStart(Intent intent) { super.onStart(intent); super.setUIContent(ResourceTable.Layout_ability_main); // 初始化UI组件 Button downloadBtn = (Button) findComponentById(ResourceTable.Id_btn_download); resultText = (Text) findComponentById(ResourceTable.Id_text_result); // 初始化UI线程EventHandler,重写事件处理逻辑 uiHandler = new EventHandler(EventRunner.current()) { @Override protected void processEvent(InnerEvent event) { super.processEvent(event); if (event.eventId == 1001) { // 接收后台线程返回的结果,直接更新UI String downloadResult = (String) event.object; resultText.setText(downloadResult); } } }; // 按钮点击触发下载任务 downloadBtn.setClickedListener(v -> { // 创建独立子线程的事件循环器 EventRunner backgroundRunner = EventRunner.create("download-thread"); EventHandler backgroundHandler = new EventHandler(backgroundRunner); // 提交耗时任务到子线程执行 backgroundHandler.postTask(() -> { // 模拟3秒下载耗时 try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } // 任务完成,发送事件到UI线程 InnerEvent completeEvent = InnerEvent.get(1001, 0, "文件下载成功,已保存到本地"); uiHandler.sendEvent(completeEvent); // 停止子线程事件循环,回收资源 backgroundRunner.stop(); }); }); } }
3. 常见扩展用法
- 发送延迟任务:调用
uiHandler.sendEvent(event, 2000)即可实现事件延迟2秒执行 - 移除待执行任务:调用
uiHandler.removeEvent(1001)即可取消所有未执行的下载完成事件 - 提交同步任务:调用
postSyncTask方法可让任务在对应线程同步执行
4. 注意事项
自定义创建的子线程
EventRunner使用完成后必须调用stop()方法回收,否则会造成内存泄漏;UI线程默认的EventRunner不要手动调用stop(),会导致应用无响应。
内容的提问来源于stack exchange,提问作者Raj Bhagat
相关产品推荐
相关产品推荐

