runOnUiThread等待30秒后执行

问题描述 投票:0回答:1

我遇到了与 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

java android ui-thread
1个回答
0
投票

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);
});
© www.soinside.com 2019 - 2024. All rights reserved.