【问题标题】:Splash screen before dialog message对话消息前的闪屏
【发布时间】:2025-12-23 09:10:17
【问题描述】:

我希望在弹出对话框之前显示几秒钟的闪屏。但是,当我加载我的应用程序时,对话框和背景屏幕会同时出现。在对话框出现之前,我该怎么做才能显示我的 splash.xml 的背景图像。

Thread waitabit=new Thread(){
public void run(){
try{
    sleep(2000);
}catch(Exception e){
    e.printStackTrace();

}

    }
};waitabit.start();

将以上内容放在我的对话框之前只会让它变暗 2 秒钟,然后立即显示所有内容。在线程内部调用我的对话框会导致错误,因为我们不能将对话框放入线程中。

谢谢

【问题讨论】:

    标签: android multithreading splash-screen


    【解决方案1】:

    尝试将上面的代码放在 AsyncTask 中,这样 UIThread 就不会休眠。

    new AsyncTask<Object, Void, Void>() {
    
        @Override
        protected void onPreExecute() {
            // show background image
        }
    
        @Override
        protected Void doInBackground(Object... params) {
            new Thread() {
                @Override
                public void run() {
                    try {
                        Thread.sleep(2000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }.run();
            return null;
        }
    
        @Override
        protected void onPostExecute(Void result) {
            // open dialog
        }
    
    }.execute();
    

    【讨论】:

    • 您能再解释一下吗?我没有看到你在哪里声明了线程 waitabit,当我把它放到 eclipse 中时,我得到一个编译错误。
    • 抱歉,复制有些仓促。我已经对其进行了编辑以使其更有意义。 onPostExecute 方法在后台线程完成后运行,因此您需要使用该方法来触发对话框。然而,onPreExecute 方法是可选的。您可以在调用 AsyncTask 上的 execute 之前加载背景图像,它不应该有所作为。这里要理解的关键是 onPreExecute 和 onPostExecute 方法在 UIThread 上运行,而后台作业则不在。
    • 同样的事情发生在对话框和背景同时出现的地方,就在两秒钟后。我想要的本质上是将对话框延迟几秒钟,并在加载(或睡眠)或类似的东西时显示背景。谢谢
    • 好的,我又编辑了。这一次,我认为它会奏效。至少在类似情况下它对我有用。
    【解决方案2】:

    This link 有一个很好的解决方案,关于如何显示初始屏幕并在初始屏幕完成后调用处理程序(即,这将允许您显示对话框)。

    【讨论】:

      【解决方案3】:

      如何让一个 Activity 显示启动屏幕,然后启动带有对话框的 Activity?

      http://www.codeproject.com/KB/android/AndroidSplash.aspx

      【讨论】:

      • 我试过了,但它看起来像一个带背景的屏幕,然后它消失了,屏幕上有对话框。看起来不对
      【解决方案4】:

      在你的 onResume 中试试这个:

      Runnable myRunnable = new Runnable(){
                  @Override
                  public void run() {
                      // do your dialog
                  }};
      Handler myHandler = new Handler();
      long delayMillis = 5000; // 5 seconds
      myHandler.postDelayed(myRunnable, delayMillis);
      

      【讨论】: