编辑
在将我的加载/创建代码移动到异步任务(见下文)之后,我仍然存在最初的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
}