ProgressDialog を示す静的メソッドを記述し、ワーカーをスレッドで実行し、ワーカーが終了した後に ProgreesDialog を閉じる必要があり、私のメソッドはワーカーが行ったことを返す必要があります。これは私のコードです:
public static TOut execute(最終コンテキスト c、最終文字列タイトル、最終文字列メッセージ、最終 IProgressWorker ワーカー、最終 TIn パラメータ) { 最終的な ValueHolder 結果 = 新しい ValueHolder(); 最終的な ProgressDialog の進行状況 = 新しい ProgressDialog(c,R.layout.progress_impl_layout); スレッドのメイン = 新しいスレッド (新しい Runnable(){ @オーバーライド public void run() { Looper.prepare();//新しい Looper を作成して、progressDialog をすぐに表示します 最終ルーパー looper=Looper.myLooper(); AsyncTask async = 新しい AsyncTask(){ @オーバーライド protected void onPostExecute(ブール値の結果) { super.onPostExecute(結果); isDone = true; looper.quit();// Looper.loopを終了 プログレス.却下(); } @オーバーライド 保護されたボイド onPreExecute() { super.onPreExecute(); progress.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL); progress.setTitle(タイトル); progress.setMessage(メッセージ); プログレス.ショー(); } @オーバーライド protected Boolean doInBackground(Integer... params) { IProgressImpl progressImpl=新しい MyProgressImpl(進行); worker.execute (progressImpl、param); true を返します。 } }; async.execute(0); if(!isDone){ Looper.loop();//progressDialog をすぐに表示 } } }); main.start(); 試す { main.join(); キャッチ(InterruptedException e){ // TODO 自動生成された catch ブロック e.printStackTrace(); } 結果を返します。値; }
すべてが機能しますが、ProgressDialog は閉じません。looper.quit() が悪いことをしているのではないかと思いますが、Looper.loop() を停止する必要があります。ProgressDialog をすぐに表示する必要があるため、 loop() を呼び出します。