为何这段看似在子线程的while循环会阻塞Android主UI?
为什么你的while循环会阻塞主UI?
咱们直接拆解你的代码逻辑:你确实新开了一个子线程,但紧接着调用的someButton.post(new Runnable())——这个方法的核心作用是把传入的Runnable投递到主UI线程的消息队列中执行!
换句话说,你新开的子线程啥实质性工作都没做,只是把那个包含while循环的任务扔给了主线程。那这个循环自然就跑到主UI线程里运行了,主线程本来就负责处理UI渲染、用户交互这些核心工作,被一个长时间运行的循环占满资源,界面不卡死才怪。
再仔细扒一下你的代码结构:
new Thread(new Runnable() { public void run() { // 这里是子线程,但你立刻调用了post方法 someButton.post(new Runnable() { public void run() { // 注意!这个run方法是在主UI线程执行的! while (HintergrundDienst.laeuft) { // 比如Thread.sleep这类操作,会直接让主线程休眠,彻底卡死界面 } // 后面的Handler.post同样是主线程,但得等循环结束才会执行 } }); } }).start();
正确的处理方式应该是这样:
- 把耗时的while循环放在子线程里执行
- 当需要更新UI的时候,再通过
post或者Handler切换回主线程
给你改个示例代码参考:
new Thread(new Runnable() { public void run() { // 耗时循环放在子线程,不占用主线程资源 while (HintergrundDienst.laeuft) { try { Thread.sleep(1000); // 模拟耗时操作 } catch (InterruptedException e) { e.printStackTrace(); } } // 循环结束后,再切换回主线程做UI更新 new Handler(Looper.getMainLooper()).post(new Runnable() { @Override public void run() { // 这里放心执行UI相关操作 } }); } }).start();
一句话总结:View.post(Runnable)是专门用来把任务丢去主线程的工具,你把耗时循环塞到这个方法里,等于直接把重担甩给了主线程,界面不阻塞才怪呢!
内容的提问来源于stack exchange,提问作者Fabien Biller
相关产品推荐
相关产品推荐

