Android启动画面无需创建新活动

时间:2013-06-20 14:37:58

标签: android opengl-es-2.0 loading splash-screen resource-management

修改

将我的加载/创建代码移动到异步任务(见下文)后 - 我仍然遇到了原始启动画面的初始问题。

那些是:

1)在onCreate中启动Async任务时,所有内容都被加载但是我的Dialog只能在调用onStart()时显示,这使整个过程变得毫无意义,因为有一个很长的停顿如果有空白屏幕,则在加载完所有内容后,“加载”对话框会闪烁一秒钟,然后消失。

2)我无法将对象加载/创建等移动到onStart,因为a)即使应用程序在被发送到我不想要的后台后恢复也会再次运行要发生,和b)当调用onCreate()中恢复savedInstanceState时,我将得到一个nullPointerException,因为我正在恢复尚未创建的对象的属性。

如果有人可以建议如何解决这些问题并创建一个简单的闪屏,真的很感激。谢谢!

背景

我的应用只使用一项活动,如果可能,我希望保持这种方式。

我已经挣扎了一个多星期了,所以真的希望有人可以帮助我。

我想要做的就是在我的资源加载(以及创建对象等)的同时使用带有简单“加载”消息的启动画面。有几点:

条件

1)启动画面应拥有自己的活动 - 所有内容都需要包含在单个活动中

2)启动画面应该使用XML布局(我创建了一个Splashscreen类,它使用View来显示加载的PNG)

3)我的应用程序是openGL ES 2.0,因此需要在OpenGL线程上加载纹理(如果需要,创建不使用GL调用的对象等可以在另一个线程上运行。)

到目前为止我尝试了什么

到目前为止我做的是创建一个对话框并在我的onStart()方法中显示它:

Dialog.show();

然后让我的onSurfaceCreated方法加载所有东西,然后用以下方法删除它:

Dialog.dismiss();

但是我需要为了varioius的原因更改它,所以现在我在onCreate()方法中的一个调用中创建我的对象,然后让我的GL Renderer的onSurfaceCreated方法加载纹理。

然而,这意味着因为 onCreate之后才显示对话框,所以在之前创建所有内容时仍会出现延迟(空白屏幕) - 屏幕显示,然后停留在屏幕上,直到纹理加载。还有其他问题可以等待另一天!

所以我的做法显然是非常错误的。我阅读了每本可以学习的教程以及我在SO和Gamedev.SE上找到的每个与闪屏相关的问题,但我仍然无法找到解释(这对我来说很有意义),以及如何实现这一点。

我希望有人可以解释一下。

1 个答案:

答案 0 :(得分:0)

你应该可以使用AsyncTask在后台加载资源,然后只是解雇你的问题

这是我用来从远程数据库加载数据的AsyncTask。这将显示加载进度循环,直到任务完成,但应该很容易重新用于显示您的启动

在后台运行的AsyncTask

private class SyncList extends AsyncTask<Void, ULjException, Void> {

    private static final String TAG = "SyncList";

    private final class ViewHolder {
        LinearLayout progress;
        LinearLayout list;
    }

    private ViewHolder m;

    /**
     * Setup everything
     */
    protected void onPreExecute() {
        Log.d(TAG, "Preparing ASyncTask");
        m = new ViewHolder();
        m.progress = (LinearLayout) findViewById(R.id.linlaHeaderProgress);
        m.list = (LinearLayout) findViewById(R.id.listContainer);

        m.list.setVisibility(View.INVISIBLE); //Set the ListView that contains data invisible
        m.progress.setVisibility(View.VISIBLE); //Set the loading circle visible you can sub in Dialog.show() here
    }

    /**
     * Async execution performs the loading
     */
    @Override
    protected Void doInBackground(Void... arg0) {
        try {
            Log.d(TAG, "Syncing list in background");
            dba.open(ListActivity.this);
            dba.sync();
        } catch (ULjException e) {
            publishProgress(e);
        }
        return null;
    }

    /**
     * Display exception toast on the UI thread
     */
    protected void onProgressUpdate(ULjException... values) {
        Log.e(TAG, values[0].getMessage());
        Toast.makeText(ListActivity.this, "Sync failed", Toast.LENGTH_LONG).show();
    }

    /**
     * Finish up
     */
    protected void onPostExecute(Void result) {
        Log.d(TAG, "ASyncTask completed, cleaning up and posting data");
        fillData();
        m.list.setVisibility(View.VISIBLE); //Show the list with data in it
        m.progress.setVisibility(View.INVISIBLE); //Hide the loading circle sub in Dialog.dismiss()
    }
}

致电任务

protected void onStart() {
    super.onStart();
    // Init the dba
    dba = DBAccessor.getInstance();
    new SyncList().execute();
}

应该注意的是,AsyncTask是与此相关的Activity的内部类

修改
onCreate Method

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_layout);

    Dialog.show();
    //This launches a new thread meaning execution will continue PAST this call
    //to onStart and your loading will be done concurrently
    //Make sure to not try to access anything that you're waiting to be loaded in onStart or onResume let your game start from onPostExectue
    new AsyncTask.execute();
}

<强> doInBackground

protected Void doInBackground(Void... arg0) {
    Load all resources here
}

<强> onPostExecute

protected void onPostExecute(Void result) {
    Dialog.dismiss();
    Call a method that starts your game logic using your newly loaded resources
}