首页 文章

在显示活动之前在后台加载活动

提问于
浏览
8

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

例如,我想要一个被调用的斜杠屏幕活动并显示一个闪屏 . 显示此启动画面时,将加载下一个活动,并在加载完成后(当它的onCreate()完成时),启动屏幕活动结束,并显示新活动 .

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

有任何想法吗?谢谢!

2 回答

  • 1

    由于您没有代码示例,我不确定您要加载什么类型的数据以及如何根据数据动态配置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元素 . 如果您想了解有关处理旋转的更多信息,这将需要一个单独的线程(或者您可以只搜索它) .

  • 5

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

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

相关问题