【问题标题】:Android onCreate and AsyncTask delayAndroid onCreate 和 AsyncTask 延迟
【发布时间】:2013-02-15 15:20:27
【问题描述】:

我的应用需要加载一些 JSON,然后才能在 UI 上显示任何内容,JSON 决定了应用的主题化方式。

虽然我通常不喜欢它们,但需要启动屏幕/加载屏幕,这样用户就不必看到界面的每个元素都会改变颜色等。但是我的问题是,当我加载我的应用程序时,在我的进度对话框启动之前,我可以在几秒钟内看到默认样式。我可以看到默认的深色渐变全息背景,以及包含我的应用标题的操作栏。如果我在 XML 中隐藏操作栏,我以后无法将其添加回来,并且在操作时会得到nullpointerexceptions

我什至在设置AsyncTask 之前尝试在onCreate() 的开头启动启动画面,并尝试在onPreExecute() 中启动它。

理想情况下,我希望能够在应用启动时立即显示加载对话框,或者如果确实需要延迟,我只想让用户看到黑色背景。

有没有我没有提到的完全不同的方法?

谢谢。

【问题讨论】:

  • 使用单独的活动作为启动画面
  • 如何在我的(当前)MainActivity 中从单独的初始屏幕活动中设置样式和加载内容?
  • 使用 findViewbyid 将布局的主要元素连接到源代码,并使用 setvisible(GONE) 将其隐藏在源代码中。在你的 asynctask 的 postexecute 中取消隐藏它

标签: android performance android-layout android-asynctask oncreate


【解决方案1】:

我实际上会考虑在这里使用片段。您可以为初始屏幕创建一个片段,并在您的活动首次开始时加载该片段。然后,一旦您的 json 加载/解析完成,您可以使用 FragmentTransaction 将您的第二个“屏幕”作为第二个片段加载,并让它替换您的加载屏幕。这也可以让你做一些漂亮的过渡动画。

这可以用来自 njzk2 的评论类似地完成,有两个单独的活动。本质上,您将在“加载活动”期间进行解析 AsyncTask 并将结果存储为可序列化的对象,该对象可以使用 Intent extra 传递给您的其他活动,或者您可以将 json 存储到 SharedPreferences 字典中并在您的第二个活动。

您可能还会发现,您不必每次启动都执行此操作。如果是这样,您应该将可序列化保存到磁盘以便您可以跳过解析或保存到共享首选项,以便您可以在那里引用它(如果存在)。

【讨论】:

    【解决方案2】:

    您看到的是根据您的主题主题的空活动。 因此,您无能为力 - 如果引导活动需要一些时间,它将显示出来。

    您可以做的是在您的活动上设置特殊主题,将splash-image设置为windowBackground(窗口装饰视图的背景),如果您不需要它,请稍后删除背景。

    <style name="SplashScreenActivityTheme" parent="android:Theme.Light.NoTitleBar">
            <item name="android:windowBackground">@drawable/splash_image</item>
    </style>
    

    更多信息你可以阅读here in fresh post of Cyril Mottier

    还有一点注意:android 通常不使用闪屏。如果您的设计师不反对,您可以使用一些进度指示器,例如 ProgressBar 或其他东西

    【讨论】:

    • 它有点复杂,偶尔,启动屏幕的图像可能会改变,但它仍然会使用文件系统上的本地图像。因此,在 xml 中设置背景(本质上是硬编码)并不合适。谢谢你的回复和这篇文章,我现在通读了。
    猜你喜欢
    • 2016-07-08
    • 1970-01-01
    • 2011-05-09
    • 2023-03-15
    • 2014-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多