2011-03-02 11 views
0

私は最初のAndroïdアプリケーションを開発していますが、ProgressDialogを表示してプロセスが実行中であることを示すときに問題に直面しています。 私のアプリケーションでは、ユーザーはボタンを押すことによって時間のかかるタスクを引き起こします。ユーザーがボタンを押すと、 "OnClickListener"の "OnClick"機能が呼び出されます。この機能では、ここで私が現在やっているものです:スレッドとProgressDialog

 - creation and configuration of an instance of the ProgressDialog class, 
     - creation of a thread dedicated to the time consuming task, 
     - attempt to display the ProgressDialog using the "show" method, 
     - start of the thread, 
     - main Activity suspended (call of the "wait" function) 
     - wake up of the main Activity by the thread when it is finished 
     - removal of the ProgressDialog by calling the "dismiss" function. 

すべてが正常に動作します(長いタスクの結果が正しい)が、ProgressDialogのヌヴェールが表示されます。私は間違って何をしていますか?

あなたが私を助けるために過ごす時間を事前に感謝します。

答えて

2

メインアクティビティ/ UIスレッドにはwait()を呼び出すべきではありません。これは実際にはProgressDialogを含むUIをフリーズしているため、フェードインする時間がなく、表示されません。

正しくマルチスレッドを使用するようにしてください:http://developer.android.com/resources/articles/painless-threading.html

final Handler transThreadHandler = new Handler(); 

public void onClick(View v) { 
    // show ProgressDialog... 
    new Thread(){ 
     public void run(){ 
      // your second thread 
      doLargeStuffHere(); 
      transThreadHandler.post(new Runnable(){public void run(){ 
       // back in UI thread 
       // close ProgressDialog... 
      }}); 
     } 
    }.start(); 
} 
0

それが目的だとして、私は、AsyncTaskを使用することをお勧めしは、この種の問題を処理するために、正確です。使用方法については、hereを参照してください。 Floernの答えにリンクされたページには、AsyncTaskの使用を推奨しています。

あなたは、次の操作を行う必要があるでしょう:

  • サブクラスAsyncTask
  • オーバーライドそれが作成し、ProgressDialogを表示するonPreExecute()方法です。 (サブクラスのメンバで参照を保持することもできます)
  • これは、時間のかかる処理を実行するメソッドdoInBackground()をオーバーライドします。
  • ダイアログを非表示にするには、onPostExecute()メソッドをオーバーライドします。
  • あなたのアクティビティでは、サブクラスのインスタンスを作成し、​​を呼び出します。

サブクラスをアクティビティの内部クラスにすると、すべてのアクティビティのメンバーを使用することもできます。

+0

この方法を使用すると、時間のかかる処理が完了するまでメインのアクティビティを中断する元のポスターの要件を満たしますか? – shyamal

+0

なぜ彼はそれをしたいと思いますか? UIスレッドは、バックグラウンドスレッドが実行されている間に(アニメ)進捗インジケータを表示します。 (wait()を呼び出すとアクティビティではなくUIスレッドが中断されます)。質問を正しく理解していれば、ボックスには要件は含まれていませんが、代わりにソリューションが試行されます。 – user634618

関連する問題