9

ビューをそのアクティビティに切り替える前に、バックグラウンドで新しいアクティビティをロードすることは可能ですか?

たとえば、呼び出されてスプラッシュ画面を表示するスラッシュ画面アクティビティが必要です。このスプラッシュ画面が表示されている間、次のアクティビティが読み込まれ、読み込みが完了すると(onCreate()が終了すると)、スプラッシュ画面のアクティビティが終了し、新しいアクティビティが表示されます。

別のオプションは、新しいアクティビティでスプラッシュ画面を表示し、非同期タスクを使用してスプラッシュイメージを削除する前にすべてのデータをロードすることです...しかし、私もそのアプローチに固執しています。アクティビティは、最初にかなりの量のデータをロードする必要があり、次にそのデータに基づいてGUI要素を動的に追加する必要があります。GUIが完全にロードされたら、スプラッシュ画面を削除します。問題は、doInBackground()からUIスレッドにアクセスできないことです。doInBackgroundからUIを更新できない場合、スプラッシュ画面の背後にアクティビティを作成するにはどうすればよいですか?onProgressUpdate()がUIスレッドにアクセスできることは知っていますが、その実装方法がわかりません。

何か案は?ありがとうございました!

4

2 に答える 2

6

コードの例がないため、ロードしているデータの種類と、データに基づいて UI を動的に構成する方法がわかりませんが、できる限り答えようとします。その結果、答えは少し一般的に聞こえるかもしれません。

まず、2 つのレイアウト xml ファイルを定義します。1 つはスプラッシュ スクリーン用で、もう 1 つは「メイン」アクティビティ用です。/res/layout/splash_screen.xml と /res/layout/main.xml になります。

onCreate() で、splash_screen レイアウトをロードします。

setContentView(R.layout.splash_screen);

非同期タスクでは、必要なすべてのデータをロードし、そのすべてのデータを何らかのデータ構造に保存します。例として、String の LinkedList を使用します。

private class MyTask extends AsyncTask<Uri, Integer, List<String>> {

    @Override
    protected List<String> doInBackground(Uri... params) {
        List<String> myList = new LinkedList<String>();
        // load up the list with data you are trying to get
        myList.add("foo");
        myList.add("bar");
        // whatever you return here will be passed in as a parameter to the onPostExecute()
        return myList;
    }

    @Override
    protected void onPostExecute(List<String> result) {
        setContentView(R.layout.main2);
        // set layout elements with data that from the result
        TextView myTextView = (TextView) findViewById(R.id.some_label);
        myTextView.setText(result.get(0));
        // or just call some function you defined in your activity instead
    }
}

したがって、基本的には、2 つの異なるレイアウト ファイルを用意し、splash_screen レイアウトを使用し、非同期タスクを使用してデータをロードし、定義したデータ構造に保存し、そのデータ構造を使用して、setContentView を使用した後に onPostExecute() で UI 要素をロードします。 () をクリックして、メイン レイアウトに戻します。

特記事項: 上記のコードでは、スプラッシュ スクリーンが再度表示され、画面を回転するとすべてのデータが再度リロードされます。これを回避したい場合は、onSaveInstanceState() を使用して、必要なデータを outBundle に保存し、そのデータを onCreate の savedInstanceState バンドルに読み込んで、UI 要素を再度読み込むことができます。ローテーションの処理について詳しく知りたい場合は、別のスレッドが必要になります (または、単に検索することもできます)。

于 2012-10-23T19:29:07.087 に答える
1

私が考えることができるあなたの問題を解決するための解決策の1つは、スプラッシュ画面とコンテンツを表示するために1つのアクティビティを使用することです。setContentView()メソッドはいつでも(onCreate()メソッドだけでなく)呼び出すことができるため、必要なすべてのビューを個別のXMLファイルで定義し、切り替えるときに関連するIDをsetContentView()に渡すだけです。

ビューとスプラッシュ画面で1つのレイアウトを使用し、属性を非表示/再表示することもできます。データがロードされているとき、ルートビューが表示されないまま、スプラッシュ画面のsetVisibilityがVisibleになります。ロードが終了したら、逆の方法で行います。

于 2012-10-23T19:14:55.250 に答える