1

アプリのサーバーからデータを取得しています。「getData」関数は、アプリのメイン アクティビティのスプラッシュ スレッドに含まれています。私が抱えている問題はこれです:

アプリをロードした後にニュースや説明をすばやく入力すると、すべての情報がロードされていないことに気付きます (保存する必要がある最後の 2 つまたは 3 つの文字列は null です)。ただし、メイン メニューを表示してから (スプラッシュ スレッドの完了後) 数秒間アプリを許可すると、問題は発生せず、すべての情報が電話に正しく保存されます。スプラッシュ スクリーンを数秒遅らせてみましたが、それは実際にはエレガントな解決策ではなく、常に機能するわけでもありません。

私の質問は、「最終的に」にジャンプする前に機能が完了していることを確認するにはどうすればよいかということです

別のクラスのパブリック静的文字列配列にデータを保存するだけで、どのデータベースにもデータを保存していません。

以下に私のコードがあります:

if(networkAvailable()){
        Thread splashTread = new Thread() {
            @Override
            public void run() {
                try {

                    getData.execute(description_Hyperlinks);
                    getNews.execute(new String[]{newsJSON_Hyperlink});
                    getOffers.execute(new String[]{offersJSON_Hyperlink});

                    for(int i = 0; i<3; i++)
                        Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } finally {
                    finish();
                    startActivity(new Intent(FlexFormActivity.this, MainMenu.class));
                    stop();
                }
            }
        };
        splashTread.start();
4

1 に答える 1

2

最初の質問に対するコメントの議論をより読みやすく、物理的に見やすくする目的で


AsyncTask-classの形式で、非同期タスク処理の Android 組み込みサポートを使用することをお勧めします。これにより、タスクを「フック」して、進行状況のさまざまな段階に対応する機会を得ることができます。

アイデアは、 makegetDatagetNewseach getOffersextendsAsyncTaskではなく、データ、ニュース、オファーを次々にロードする単一のタスク (「LoadContents」などと呼ばれる) を持つことです。

そうすれば、最初の作業全体がいつ完了したかを判断できるため、この「タスクの完了」に、想像できるどのような形でも簡単に対応できます。


少しコードを確認すると、通常はThread-class 自体を使用する必要はありません。Java と Android はそれを囲む多くのラッパー (特にJava Executor Framework ) を提供しているため、よりクリーンで信頼性の高いものを生成するために優先する必要があります。コード。


また、「戻るボタンを無効にする」(@Eugen がスプラッシュスクリーンを表示したままにするために使用する) ことに関する一般的なアドバイスとして:実行しないでください。これは、ユーザーがアプリケーションを使用するときに期待するような動作ではありません。

誰かがうっかりアプリを開いたとします。コンテンツの最初の読み込みに 10 秒ほどかかり、このプロセスをキャンセルすることはできません。ユーザーは、アプリを使用せずに終了するまで、ずっと待つ必要があります。

したがって、戻るボタンを「非アクティブ化」するのではなく、タスク (およびアプリケーションの初期ロード) を「キャンセル可能」にする必要があります。を使用する場合AsyncTask、これはすでに実装されています。

于 2012-04-07T23:52:46.687 に答える