9

是否可以在将视图切换到该活动之前在后台加载新活动?

例如,我想要一个斜线屏幕活动,它被调用并显示一个启动屏幕。在显示此初始屏幕时,会加载下一个活动,当它完成加载时(当它的 onCreate() 完成时),初始屏幕活动结束,并显示新活动。

我知道另一种选择是在新活动中显示启动画面,并在删除启动图像之前使用异步任务加载所有数据......但我也坚持这种方法。该活动首先必须加载大量数据,然后必须根据该数据动态添加 GUI 元素。完全加载 GUI 后,我想删除启动画面。问题是我无法从 doInBackground() 触摸 UI 线程。如果我无法从 doInBackground 更新 UI,如何在初始屏幕后面创建我的活动?我知道 onProgressUpdate() 可以访问 UI 线程,但我不知道如何实现它。

有任何想法吗?谢谢!

4

2 回答 2

6

由于您没有代码示例,因此我不确定您正在加载哪种数据以及如何根据数据动态配置 UI,但我会尽可能多地回答。因此,答案可能听起来有点笼统。

首先,定义 2 个布局 xml 文件 - 一个用于启动屏幕,一个用于“主要”活动。所以你最终会得到 /res/layout/splash_screen.xml 和 /res/layout/main.xml

在您的 onCreate() 中,加载 splash_screen 布局:

setContentView(R.layout.splash_screen);

在您的异步任务中,您将加载需要执行的任何数据,并将所有这些数据保存在某种数据结构中。例如,我将使用 String 的 LinkedList。

private class MyTask extends AsyncTask<Uri, Integer, List<String>> {

    @Override
    protected List<String> doInBackground(Uri... params) {
        List<String> myList = new LinkedList<String>();
        // load up the list with data you are trying to get
        myList.add("foo");
        myList.add("bar");
        // whatever you return here will be passed in as a parameter to the onPostExecute()
        return myList;
    }

    @Override
    protected void onPostExecute(List<String> result) {
        setContentView(R.layout.main2);
        // set layout elements with data that from the result
        TextView myTextView = (TextView) findViewById(R.id.some_label);
        myTextView.setText(result.get(0));
        // or just call some function you defined in your activity instead
    }
}

因此,基本上,有 2 个不同的布局文件并使用 splash_screen 布局,并使用异步任务加载数据并将其保存在您定义的某些数据结构中,并在使用 setContentView 后使用该数据结构在 onPostExecute() 中加载您的 UI 元素() 更改回您的主布局。

特别注意:使用上面的代码,如果您旋转屏幕,它将再次显示启动屏幕并重新加载所有数据。如果您想避免这种情况,您可以使用 onSaveInstanceState() 并在 outBundle 中保存您想要的任何数据,然后在 onCreate 的 savedInstanceState 包中读回该数据并重新加载 UI 元素。如果您想了解有关处理旋转的更多信息,这将需要一个单独的线程(或者您可以只搜索它)。

于 2012-10-23T19:29:07.087 回答
1

我能想到的解决您的问题的解决方案之一是使用一项活动来显示启动屏幕和您的内容。由于您可以随时调用 setContentView() 方法(不仅在 onCreate() 方法中),只需在单独的 XML 文件中定义您想要的所有视图,并在切换时将相关 id 传递给 setContentView()。

您还可以在视图和启动屏幕中使用一种布局,并隐藏/取消隐藏属性。当您的数据将 setVisibility 加载到您的初始屏幕时,您的根视图仍然不可见。完成加载后 - 以相反的方式进行。

于 2012-10-23T19:14:55.250 回答