YYPOST群发软件 发表于 2026-9-28 06:59:26

后台子线程runJsFile和runOnUiThread实时反馈



后台子线程runJsFile和runOnUiThread实时反馈





https://www.yuque.com/aiwork/nba2pr/emximr9gu1eui3tp
// 主脚本.js —— 被 start.js 用 Import() 执行
// 实用型演示:后台子线程(runJsFile)批量处理任务 + 主线程(runOnUiThread)实时反馈进度到悬浮窗。
// 设计原则:子线程只干活+喊话(reportProgress),绝不自己改界面;界面刷新一律走 runOnUiThread。

// —— 全局 UI 引用(顶层 var = 全局,子线程回调里能访问到)——
var gUI = null, gTv = null, gPb = null, gSub = null;

function buildFeedbackUI() {
    gUI = new floatUI();
    gUI.loadXML(
      '<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ' +
      'android:layout_width="match_parent" android:layout_height="wrap_content" ' +
      'android:orientation="vertical" android:padding="12dp">' +
      '<TextView android:id="tv" android:layout_width="match_parent" android:layout_height="wrap_content" ' +
      '    android:text="准备启动后台任务..." android:textColor="#222222" android:textSize="16sp"/>' +
      '<TextView android:id="pb" android:layout_width="match_parent" android:layout_height="wrap_content" ' +
      '    android:text="进度:0%" android:textColor="#1565C0" android:textSize="16sp" android:layout_marginTop="6dp"/>' +
      '<TextView android:id="sub" android:layout_width="match_parent" android:layout_height="wrap_content" ' +
      '    android:text="成功 0 / 失败 0" android:textColor="#666666" android:textSize="14sp" android:layout_marginTop="4dp"/>' +
      '</LinearLayout>'
    );
    gTv= gUI.findViewById('tv');
    gPb= gUI.findViewById('pb');
    gSub = gUI.findViewById('sub');
}

// 子线程调用:把"单项进度"刷到界面(必须用 runOnUiThread 切回 UI 线程改控件)
function reportProgress(done, total, ok, fail, status) {
    var t = new thread();
    t.runOnUiThread(function () {
      if (gTv)gTv.setText(status + '(' + done + '/' + total + ')');
      if (gPb)gPb.setText('进度:' + Math.round(done * 100 / total) + '%');
      if (gSub) gSub.setText('成功 ' + ok + ' / 失败 ' + fail);
      printl(' 进度刷新:' + done + '/' + total + ',' + status);
    });
}

// 子线程调用:全部完成后的汇总反馈
function reportDone(total, ok, fail) {
    var t = new thread();
    t.runOnUiThread(function () {
      if (gTv)gTv.setText('✅ 全部完成:共 ' + total + ' 项');
      if (gSub) gSub.setText('成功 ' + ok + ' / 失败 ' + fail + '(失败项见日志)');
    });
    printl('主线程收到汇总:成功 ' + ok + ' / 失败 ' + fail);
}

function demo_runJsFile() {
    buildFeedbackUI();
    printl('界面已弹出,后台子线程开始批量处理');

    var worker = new thread();
    // 同目录相对文件名;runJsFile 自动按脚本目录解析,不要写 /sdcard/ 绝对路径
    worker.runJsFile('worker_file.js', '后台任务线程');

    // 进度由子线程回调刷新,主线程不必空轮询等它。
    // 但必须保活主线程:AIWROK 主线程一跑完,子线程和定时器全死。
    (function keepAlive() {
      if (worker.isAlive()) {
            runTime.setTimeout(keepAlive, 400);
      } else {
            printl('主线程:后台任务线程已退出');
      }
    })();
}

// ── 触发演示 ──
demo_runJsFile();






页: [1]
查看完整版本: 后台子线程runJsFile和runOnUiThread实时反馈