You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:15:03