Android 在后台加载活动,然后再显示它

Android 在后台加载活动,然后再显示它,android,Android,在将视图切换到新活动之前,是否可以在后台加载新活动 例如,我希望有一个斜杠屏幕活动,它被调用并显示一个启动屏幕。显示此初始屏幕时,将加载下一个活动,加载完成后(onCreate()完成时),初始屏幕活动结束,并显示新活动 我知道另一个选择是在新活动中显示启动屏幕,并在删除启动图像之前使用异步任务加载所有数据。。。但我也坚持这种方法。活动首先必须加载相当数量的数据,然后必须基于该数据动态添加GUI元素。一旦GUI完全加载,我想删除启动屏幕。问题是我无法从doInBackground()接触UI线程

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

例如,我希望有一个斜杠屏幕活动,它被调用并显示一个启动屏幕。显示此初始屏幕时,将加载下一个活动,加载完成后(onCreate()完成时),初始屏幕活动结束,并显示新活动

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


有什么想法吗?谢谢大家!

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


您还可以将一个布局与视图、闪屏和隐藏/取消隐藏属性一起使用。当数据加载时,将启动屏幕的可见性设置为可见,而根视图保持不可见。当完成加载时-以相反的方式执行。

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

首先,定义2个布局xml文件——一个用于初始屏幕,另一个用于“主要”活动。 因此,您将得到/res/layout/splash_screen.xml和/res/layout/main.xml

在onCreate()中,加载启动屏幕布局:

setContentView(R.layout.splash_screen);
在异步任务中,您将加载需要执行的任何数据,并将所有数据保存在某种数据结构中。举个例子,我将使用一个字符串的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
    }
}
私有类MyTask扩展了AsyncTask{
@凌驾
受保护列表doInBackground(Uri…参数){
List myList=newlinkedlist();
//用您试图获取的数据加载列表
myList.add(“foo”);
myList.添加(“栏”);
//这里返回的任何内容都将作为参数传递给onPostExecute()
返回myList;
}
@凌驾
受保护的void onPostExecute(列表结果){
setContentView(R.layout.main2);
//使用从结果中删除的数据设置布局元素
TextView myTextView=(TextView)findViewById(R.id.some_标签);
myTextView.setText(result.get(0));
//或者只调用您在活动中定义的函数
}
}
因此,基本上,有两个不同的布局文件,使用启动屏幕布局,使用异步任务加载数据并将其保存在您定义的某个数据结构中,在使用setContentView()更改回主布局后,使用该数据结构在onPostExecute()中加载UI元素

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

很抱歉,我无法提供任何代码,因为我签署了NDA,阻止我共享代码。不过我可以笼统地说。我基本上是根据条件加载一个xml,该xml文件告诉我需要显示哪些图像,以及与该图像相关的信息。我从返回的图像列表中浏览并动态创建图像视图,并将它们添加到视图中。在屏幕上弹出所有内容(有很多图像)需要2-3秒的时间,因此我希望在所有内容加载并准备好与之交互之前显示一个splash。在这种情况下,我认为您可以在上面的doInBackground()函数中解析XML文件,创建ImageView并设置图像源,并从doInBackground()函数返回ImageView的列表。onPostExecute()函数将获取ImageView列表,并将它们添加到setContentView()之后的视图层次结构中。在onPostExecute()中执行的任何操作都会在主线程中运行,因此您可以从这里修改UI元素。非常好,我将对此进行演示,并看看它是如何工作的。非常感谢。(这可能需要一段时间,但如果它起作用,我一定会回来,并将您的答案标记为已接受)对不起,没有更快地对此作出回应。我的解决方案是在其他视图的顶部放置一个图像,完成加载后,我从onPostExecute中删除了该图像。谢谢你,虎斑@tigerpenguin如果我有一些在onLoad期间发生的动画,但是因为活动本身是使用动画调用的,那么之后的任何其他动画都是不稳定的。如何使用上面提到的aynctask等待活动完全加载,然后再对该活动中的其他对象(例如textview、imageview)进行动画制作?我如何调用AsyncTask,而不是设置contentview,而是在contentview完成后再执行其他动画。(从我的主要活动中我怎么称呼它?)你可以设置一个包含你的启动屏幕的主题