我遇到了与 UI 线程上的代码执行相关的极其奇怪的行为。
在那里,我启动一个线程,等待一些服务器数据获取完成,然后运行 ui 更新。
但问题是
runOnUiThread
命令只有在总共30秒过去后才开始执行。我完全不知道为什么会这样。
其他地方绝对没有其他东西在运行。
//This runs on Main thread
final long start = new Date().getTime();
Log.e("TESTUI1", ""+start);
new Thread(new Runnable() {
@Override
public void run() {
try {//for demo purpose, this replaces a server data fetch process
Thread.sleep(5000);
} catch (InterruptedException e) {
}
runOnUiThread(new Runnable() {//this kicks off after a total of 30 seconds have passed
public void run() {
long delta = new Date().getTime() - start;
Log.e("TESTUI2", ""+delta);
}
});
}
}).start();
这是 Logcat 的输出:
2023-08-30 21:22:34.375 10534-10534 TESTUI1 E 1693423354375
2023-08-30 21:23:08.814 10534-10534 TESTUI2 E 34439
runOnUiThread
发消息给你主Looper
的MessageQueue
,他们的消息一一处理。
因此,
MessageQueue
可能充满了其他需要很长时间处理的消息,这将导致您的Runnable
执行之前有很长的延迟。
您可以通过将
runOnUiThread
替换为以下代码来验证这一点:
// this will insert your Runnable at the front of MessageQueue
new Handler(Looper.getMainLooper()).postAtFrontOfQueue(() -> {
long delta = new Date().getTime() - start;
Log.e("TESTUI2", ""+delta);
});