2012-04-07 36 views
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(); 
+0

あなたは[ 'AsyncTask'](http://developer.android.com/reference/android/os/AsyncTaskを使用する必要があります。html)を使用しています。タスクの作業が進むにつれて、特定のことを実行する可能性があります。 –

+0

getData、getNewsおよびgetOffersは、AsyncTaskクラスのインスタンスです。 – Eugen

+0

あなたはその概念を理解していません。作業をすべて行う単一の「AsyncTask」(例えば、「LoadContents」と呼ばれる)を作成する方がよいでしょう。このタスクでは、データ、ニュース、オファーをロードして表示することができます。タスクが終了すると、すべてがセットアップされ、ユーザーに表示されます。 Javaのexecutor-frameworkである 'Thread'を使用する必要はありません。Androidsの実装は、常にあなたのためにこれをまとめなければなりません。 –

答えて

2

最初の質問にコメントで議論を行うことを目的として、より読みやすく、物理的に目に見える


AsyncTask-classの形式で非同期タスク処理のためのAndroidビルドインサポートを使用するというアイデア。これにより、タスクを「フックイン」することができ、進捗のさまざまな段階に反応する機会が与えられます。

アイデアはgetDatagetNewsgetOffersAsyncTask延長ではなく、次々とデータ、ニュースやオファーをロードする(例えば「LoadContents」と呼ばれる)単一のタスクを有することをしないことであろう。

その後、全体の最初の仕事は、あなたが想像できるどんな形で、この「タスクの完了」に反応することを容易にするた、行われたとき、決定することが可能になります。少しのコード・レビューとして


JavaとAndroidが順番に好まれるべきで、その周りに多くのラッパー(特にJava Executor Framework)を提供して、通常、自分自身級Threadを使用する必要がありませんよりクリーンで信頼性の高いコードを生成できます。

(スプラッシュスクリーンが存在とどまることを確実にするために@Eugenで使用されている)「バックボタンを無効化」に関する一般的なアドバイスなども

、:はそれをしないでください。これは、ユーザーがアプリケーションを使用するときに期待する動作のようなものではありません。

は、誰かがaccedently内容の初期ロードのために〜10秒かかりアプリを、オープンしました想像し、そしてこのプロセスはキャンセルできません。ユーザーはその時間を待つだけで、それを使わずにアプリを離れることができます。

したがって、あなたは、バックボタンを「無効」のではなく、あなたのタスク(およびアプリケーションのため、初期ロード)は「キャンセル可能な」作るべきではありません。 AsyncTaskを使用している場合、これは既に実装されています。

+0

お時間をいただきありがとうございます。私はバックボタンの上書きを使用しませんでしたが、誰かが私にそれを提案しましたが、それはまた悪い考えを見つけました:D – Eugen

+0

@Eugen私は助けてくれるとうれしいです:D –

関連する問題