0

編集

ロード/作成コードを非同期タスクに移動した後 (以下を参照)、元のスプラッシュスクリーンで発生した初期の問題がまだ残っています。

それらは次のとおりです。

1) onCreate で非同期タスクを開始すると、すべてが読み込まれますが、私のダイアログは onStart() が呼び出されたときにのみ表示され、空白の画面で長い一時停止があり、すべてが読み込まれた後にプロセス全体が無意味になります、「読み込み中」ダイアログが消える前に一瞬点滅します。

2)オブジェクトのロード/作成などを onStart に移動できません。これは、a) 発生したくないバックグラウンドに送信された後にアプリが再開された場合でも再度実行されるため、および b) 復元を呼び出すときまだ作成されていないオブジェクトのプロパティを復元しているため、nullPointerException が発生します。

誰かがこれらの問題を回避し、簡単なスプラッシュスクリーンを作成する方法をアドバイスしてくれたら本当にありがたい. ありがとう!

バックグラウンド

私のアプリは 1 つのアクティビティのみを使用しており、可能であればその方法を維持したいと考えています。

私はこれに1週間以上苦労しているので、誰かが私を助けてくれることを本当に願っています.

私がしたいのは、リソースのロード中 (およびオブジェクトの作成中など) に、単純な「ロード中」メッセージが画面に表示されるスプラッシュスクリーンを使用することだけです。ポイントがいくつかあります。

条件

1) スプラッシュスクリーンは独自のアクティビティを持つべきではありません- すべてが単一のアクティビティに含まれている必要があります

2) スプラッシュスクリーンはXML レイアウトを使用しないでください(ビューを使用してロード中の PNG を表示するスプラッシュスクリーン クラスを作成しました)。

3) 私のアプリは openGL ES 2.0 であるため、テクスチャを OpenGL スレッドにロードする必要があります (GL 呼び出しを使用しないオブジェクトなどの作成は、必要に応じて別のスレッドに移動しても問題ありません)。

私がこれまでに試みたこと

これまでに行ったことは、ダイアログを作成し、onStart() メソッドで次のように表示することでした。

Dialog.show();

次に、すべてを onSurfaceCreated メソッドにロードしてから、次のように削除します。

Dialog.dismiss();

ただし、さまざまな理由でこれを変更する必要があったため、onCreate() メソッド内の呼び出しからオブジェクトを作成し、テクスチャを GL レンダラーの onSurfaceCreated メソッドにロードするだけです。

ただし、これは、ダイアログがonCreate のまで表示されないため、スプラッシュ スクリーンが表示される前にすべてが作成されている間に遅延 (空白の画面) が発生し、テクスチャが読み込まれるまで画面に表示されたままになることを意味します。これには他にも問題があり、別の日に待つことができます!

したがって、私のアプローチは明らかに非常に間違っています。SOとGamedev.SEで見つけることができるすべてのチュートリアルと、スプラッシュスクリーン関連のすべての質問を読みましたが、これをどのように達成できるかについての説明はまだ見つかりません(私にとっては理にかなっています)。

ここで誰かが説明できることを願っています。

4

1 に答える 1

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 メソッドの編集

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
}
于 2013-06-20T14:52:48.523 に答える