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

Android在while循环中更新TextView无反应但日志正常 该如何解决?

问题根因

Android遵循单线程UI模型:所有视图更新必须在主线程执行,同时主线程还要负责处理所有UI交互、视图绘制事件。你当前将DFU升级的耗时循环、Thread.sleep逻辑都直接写在onClick回调中,而onClick本身运行在主线程,会直接阻塞主线程的消息循环:tv_percent_val.setText()本质只是往主线程消息队列插入了一条更新请求,必须等主线程空闲时才会执行实际绘制,所以要等到整个while循环结束、主线程释放资源后才能看到UI更新;而Log输出不需要依赖主线程绘制逻辑,所以可以正常打印。

修复方案

把耗时的DFU操作全部移到子线程执行,仅在需要更新TextView的时候切回主线程即可,修改后代码如下:

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        // 启动子线程执行耗时DFU操作
        new Thread(new Runnable() {
            @Override
            public void run() {
                dfu_lib.enterdfumode("/dev/ttyS1");
                dfu_lib.open("/dev/ttyS1", "/storage/self/primary/Download/H28180-V1R5-10000.dfu", 1);
                dfu_lib.program();
                do{
                    percent = dfu_lib.getpercent();
                    Log.i("NF_LOG_Android_Percent", String.valueOf(percent));
                    // 切回主线程更新UI
                    tv_percent_val.post(new Runnable() {
                        @Override
                        public void run() {
                            tv_percent_val.setText(String.valueOf(percent));
                        }
                    });
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }while(percent<100);
                Log.i("NF_LOG", "ttyS1 update done");
                dfu_lib.close();
                // 升级完成后如果需要做UI提示,同样要切回主线程执行
            }
        }).start();
    }
});

注:如果percent为方法内局部变量,需要调整为类成员变量,或者替换为AtomicInteger类型,避免匿名内部类访问报错。

内容的提问来源于stack exchange,提问作者adam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 01:27:03