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
相关产品推荐
相关产品推荐

