0

編輯Android的啓動畫面,而無需創建一個新的活動

移動我的加載/創建代碼到一個異步任務(見下文)後 - 我仍然有我有我原來的啓動畫面初始問題。

那些在於:

1)在啓動中的onCreate異步任務,一切都被加載,但是當在onStart()被調用,這使得整個過程那種毫無意義的,只能顯示在我的對話框出現是一個長時間的停頓,一個空白的屏幕,然後在所有的東西都加載之後,'加載'對話框在瞬間閃爍,然後消失。

2)我無法將對象加載/創建等移動到onStart,因爲a)即使應用程序在發送到我不希望發生的背景後恢復,它也會再次運行,並且b)當調用恢復onCreate()中的savedInstanceState時,我會得到一個nullPointerException,因爲我正在還原尚未創建的對象的屬性。

如果有人能建議如何解決這些問題並創建一個簡單的飛濺屏幕,我們將非常感激。謝謝!

背景

我的應用程序只使用一個活動,我想,如果能夠保持這種方式。

我一直在努力爭取了一個多星期,所以真的希望有人能幫助我。

所有我想要做的就是使用閃屏用,而我的資源負荷(和對象創建等)在屏幕上顯示一個簡單的「加載」消息,有幾個要點:

條件

1)濺射屏幕應該有它自己的活動 - 一切都需要包含在一個單一的活動

2)濺射屏幕應該使用XML佈局(我創建了一個使用View來顯示加載PNG的Splashscreen類)

3)我的應用程序是openGL ES 2.0,所以紋理需要加載到OpenGL線程上(創建對象等如果需要的話,不要使用GL調用可以繼續使用另一個線程)。

我已經嘗試到目前爲止

我做什麼,到目前爲止是創建一個對話框,並在我在onStart顯示它()方法:

Dialog.show(); 

然後讓一切負荷我擺脫它與之前onSurfaceCreated方法:

Dialog.dismiss(); 

但是我需要所以現在我c要改變這種對varioius原因在我的onCreate()方法中調用我的對象,並讓紋理加載到我的GL渲染器的onSurfaceCreated方法中。

然而,這意味着,後因的onCreate對話不顯示,直到,我仍然獲得了延遲(黑屏),而一切之前創建的啓動畫面顯示,這則停留在直到紋理加載完成。還有其他問題也可以等待另一天!

所以我的方法顯然是非常錯誤的。我閱讀了每一個教程,以及我可以在SO和Gamedev.SE上找到的每個與屏幕相關的問題,但我仍然無法找到解釋(對我來說很合理)以及如何實現這一點。

我希望這裏有人能解釋。

+0

你試過使用這些碎片嗎? – amalBit

回答

0

你應該能夠使用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

應該指出的是,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 
} 
+0

謝謝@jhorvat你能解釋一下這將如何幫助?我已經實現了一個簡單的異步任務,但我仍然有幾個問題。一個是我在我的onCreate()中啓動任務,因此它開始創建我的對象,但其餘代碼繼續執行,並且我得到一個空指針,因爲對象創建尚未完成。另外,我可以在這裏展示我的對話嗎?我的理解是,如果我從onCreate執行Dialog.show(),它將不會實際顯示,直到onStart(); - 這是從一個異步任務顯示它的情況,所以我有這個錯誤?謝謝你的幫助。 – Zippy

+0

您希望將依賴於初始化對象的任何調用移動到'onPostExecute'方法。您可以在'onPreExecute'中顯示對話框並將其隱藏在'onPostExecute'中('doInBackground'沒有UI線程訪問權限)。在AsyncTask中這樣做的關鍵是您的UI更新(顯示/隱藏對話框)不會被資源加載阻塞,因爲加載將在另一個線程上執行。這應該刪除您的空白屏幕問題。稍後它還允許您選擇在啓動時顯示進度條以指示用戶進度 – jhorvat

+0

如果在啓動任務之前在'onPreExecute'中顯示對話框無法在您的'onCreate'中調用show但是你仍然應該在'onPostExecute'中'解僱'它,因爲一旦AsyncTask的'doInBackground'完成,這個方法就會一直執行 – jhorvat

相關問題