Android splashscreen而不创建新活动



编辑

在将我的加载/创建代码移动到异步任务(见下文)之后,我仍然存在最初的splashscreen问题。

这些是:

1)在onCreate中启动异步任务时,所有内容都已加载,但我的对话框只能在调用onStart()时显示,这使得整个过程有点毫无意义,因为有一个长时间的空白屏幕暂停,然后在所有内容加载后,"加载"对话框会闪烁一瞬间,然后消失。

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

如果有人能建议如何解决这些问题并制作一个简单的防溅屏,我将不胜感激。谢谢

背景

我的应用程序只使用一个活动,如果可能的话,我希望保持这种状态。

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

我所想做的就是在加载资源(以及创建对象等)时,使用一个带有简单"加载"消息的splashscreen

条件

1) 防溅屏应该而不是有自己的活动-所有内容都需要包含在单个活动中

2) splashscreen应该而不是使用XML布局(我已经创建了一个splashscreen类,它使用View来显示正在加载的PNG)

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

到目前为止我尝试了什么

到目前为止,我所做的是创建一个对话框,并将其显示在onStart()方法中,其中包含:

Dialog.show();

然后让所有东西都加载到我的onSurfaceCreated方法中,然后用将其删除

Dialog.dismiss();

然而,由于各种原因,我需要更改它,所以现在我从onCreate()方法中的调用创建对象,并让纹理加载到GL Renderer的onSurfaceCreated方法中。

然而,这意味着,因为在onCreate之后才会显示对话框,所以在显示启动屏幕之前创建所有内容时,我仍然会有一个延迟(空白屏幕),然后它会一直显示在屏幕上,直到加载纹理为止。这也有其他问题,可以再等一天!

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

我希望这里有人能解释。

您应该能够使用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是活动的内部类,它与这里的相关

编辑
onCreate方法

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
}

相关内容

  • 没有找到相关文章

最新更新