给出像这样的单活动应用程序:
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()
移至异步任务不会改善用户的体验,我问的问题是,是否可以显示启动画面而不这样做。我认为答案是"没有。"
答案 0 :(得分:3)
我希望它在主线程上运行(并在执行时挂起应用程序的其余部分)
不,不会,你的用户也不会喜欢你
我相信我可以为dict.init()创建一个单独的线程,但在这种情况下看起来有点过分,因为我不希望应用程序在dict.init()运行时可用或交互。
这正是你应该做的。您可以使用多种方式,包括AsyncTask
并且在工作完成时显示ProgressDialog
。
所以用户看到一个空白的白色屏幕10秒钟。
如果花了这么长时间,那么你可能想重新考虑你的流程。即使您使用单独的Thread
并显示ProgressBar
,大多数用户也不会想要盯着它持续10秒。您应该在后台加载数据,并允许它们在加载时执行其他操作(如果可能)。您可以使用IntentService之类的内容,具体取决于您获取数据的方式。