是否有可能在Android主活动完成onCreate()之前显示一些内容?

时间:2014-05-05 18:13:17

标签: android android-activity oncreate

给出像这样的单活动应用程序:

public class MyActivity extends Activity {
  protected void onCreate(Bundle savedInstanceState) {

  loadingScreen = new RelativeLayout(this);
  // add a bitmap to loadingScreen
  setContentView(loadingScreen);

  Dict dict = new Dict();
  dict.init(); 
  // this method takes ~10 seconds 
  }
}

理论上,在字典初始化时,它会显示加载屏幕。实际上,在onCreate()返回之前不会显示任何内容,因此用户会看到一个空白屏幕10秒钟。什么是显示这个应用加载屏幕时请稍等的最佳方式?

我相信我可以为dict.init()创建一个单独的帖子,但在这种情况下这似乎有些过分,因为我不希望应用在dict.init()运行时可用或互动。我喜欢它在主线程上运行(并在执行时挂起应用程序的其余部分),我只想先在屏幕上显示一些内容。

PS,我尝试将dict.init()移到onStart(),这似乎没有效果。

编辑:也许我应该澄清这一点,以避免得到"你做错了"键入答案,但init在现代手机和桌面上花费2或3秒,旧手机上的10秒是最糟糕的情况。这个应用程序是一个文字游戏,它不能在没有字典的情况下使用。将dict.init()移至异步任务不会改善用户的体验,我问的问题是,是否可以显示启动画面而不这样做。我认为答案是"没有。"

1 个答案:

答案 0 :(得分:3)

  

我希望它在主线程上运行(并在执行时挂起应用程序的其余部分)

不,不会,你的用户也不会喜欢你

  

我相信我可以为dict.init()创建一个单独的线程,但在这种情况下看起来有点过分,因为我不希望应用程序在dict.init()运行时可用或交互。

这正是你应该做的。您可以使用多种方式,包括AsyncTask 并且在工作完成时显示ProgressDialog

  

所以用户看到一个空白的白色屏幕10秒钟。

如果花了这么长时间,那么你可能想重新考虑你的流程。即使您使用单独的Thread并显示ProgressBar,大多数用户也不会想要盯着它持续10秒。您应该在后台加载数据,并允许它们在加载时执行其他操作(如果可能)。您可以使用IntentService之类的内容,具体取决于您获取数据的方式。

Example of AsyncTask

Painless Threading