android - Handler.sendMessageDelayed(msg, delay) 无法正常工作

标签 android multithreading handler android-handler

我已经定义了一个在加载过程中显示的闪屏。但取决于互联网连接,加载可能只需要 600 毫秒,有时甚至需要 5000 毫秒。所以我定义启动画面至少显示 3000 毫秒,这样用户就不会被闪烁的屏幕激怒。

我按以下方式定义启动画面的开始:

 private void splashScreen() {
        setContentView(R.layout.splashscreen);
        splash = (ImageView) findViewById(R.id.splashscreenLayer);
        startSplashTime = new Date();
        new LoadingThread().start(); 
    }

在 LoadingThread 中,我检查网络并从 Internet 加载数据:

private class LoadingThread extends Thread {

        @Override
        public void run() {
            checkNetwork();
        }

    }

加载完成后,我会向 MainActivity 中定义的处理程序发送一条消息:

public void stopSplash() {
        Message msg = new Message();
        msg.what = STOPSPLASH;

        Date endSplashTime = new Date();
        long time = endSplashTime.getTime() - startSplashTime.getTime();
        System.out.println("Time Splashscreen was displayed: " + time);
        if (time < SPLASH_MIN_TIME) {
            long delay = SPLASH_MIN_TIME - time;
            System.out.println("Delay Splashscreen for: " + delay);
            splashHandler.sendMessageDelayed(msg, delay);
        } else {
            System.out.print("Show Splashscreen now");
            splashHandler.sendMessage(msg);
        }
    }

LoadingThreads 上的一些代码行由 runOnUIThread() 调用。不幸的是,如果时间 < SPLASH_MIN_TIME 消息不会延迟,而是会立即发送。我认为 sendMessageDelayed() 不应该是这种情况。有人知道为什么吗? sysout 显示延迟时间计算正确。谢谢!

最佳答案

也许错误不在延迟。 (没有更多代码不知道) 但可能的原因是:您的下载线程在您下载后显示另一个布局,并且启动画面在您的顶层下变得不可见。 Splashscreen 在延迟后收到您的消息,因此您以后看不到它。

关于android - Handler.sendMessageDelayed(msg, delay) 无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3076139/

相关文章:

java - 如何让 JUnit 在超时时保持一致?

multithreading - CAS 碰撞的 CPU 内部特性是什么?

java - NettyIO 未正确删除 channel

java - 点击按钮创建百度 map 时,线程报错:The application may be doing too much work on its main thread

java - Android map 定制制作者搜索?

android - Xamarin Android没有这样的方法WebView.CreatePrintDocumentAdapter

javascript - 斜杠命令 "unknown interaction"

android - 无法启动守护进程?

c# - ConfigureAwait(false) 与 ADO.Net SQLConnection 对象

java - 为什么要将 removeCallbacks() 与 postDelayed() 一起使用?