2011-06-20 14 views
1

ProgressDialogとasyncTaskのやり取りに関するヒントやアイデア。 たとえば、ボタンをクリックすると、プログラムはインターネットへの入力を検証します。これは、介入しないでください。私はProgressDialogを使用します。ProgressDialogはandroidのAsyncTaskと通信します

progressDialog.dismiss()の後、asyncTaskを呼び出してビューを更新する必要があります。 私はいくつかの方法を試しましたが、失敗しました。たとえば、 * progressynialog.dismiss()の後にasynTaskを実行します。 *進捗ダイアログスレッドの後にダイアログボックス内にasynctaskを実行します。

他の言い方をすれば、asynctaskにprogressdialogが終了したことを伝える方法はありますか?スレッド間にメッセージなどの通信がありますか?ここ

は、私のコードの例です:

btnPost.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      stockProgressDialog = ProgressDialog.show(PostActivity.this, 
        "Please wait...", "Check the post"); 
      new Thread() { 
      public void run() { 
      try{ 
       /* Connect to Internet API */ 
        stockProgressDialog.dismiss(); 
      } catch (Exception e) { } 
      // Dismiss the Dialog 
      } 
      }.start(); 
      new LookUpTask().execute(); 
     } 
    }); 

答えて

1

はい、progressDialogが終了したことをasyncTaskに伝える方法があります。 1つのonDismissListenerを使用することができます

@Override 
public Dialog onCreateDialog(int id){ 
    if(id==DIALOG_PROGRESS_DIALOG){ 
     stockProgressDialog = new ProgressDialog(Main.this); 
     stockProgressDialog.setTitle("Please wait..."); 
     stockProgressDialog.setMessage("Check the post"); 
     stockProgressDialog.setOnDismissListener(new DialogInterface.OnDismissListener() { 
      @Override 
      public void onDismiss(DialogInterface dialog) { 
       textView.setText("Waiting the 5 secs..."); 
       myAsyncTask.execute("start it"); 
       //Or myAsyncTask.cancel(true); if you want to interrupt your asyncTask 
      } 
     }); 
     return stockProgressDialog; 
    } else return super.onCreateDialog(id); 
} 
+0

私はonDismissListenerをprogressDialogの新しいスレッドに配置しました。それは仕事です。アイデアをありがとう。 – Faren

0

あなたはAsyncTask.cancel(..)を呼び出すことにより、AsyncTaskをキャンセルし、新しいAsyncTaskを起動することができます。 AsyncTaskを並列アクティビティとして実行することは想定されていません。外部からの介入なしに実行して終了できるはずです。

0

非同期を拡張し、doInBackgroundから結果を返します。 onProgressの更新では、非同期タスクの制御下でProgressダイアログを閉じることができます。 onPostExecuteのdoInBackgroundからの結果を処理します。

//create the task 
theBackground = new Background(); 
theBackground.execute(""); 
-------- 

private class Background extends AsyncTask<String, String, String>{ 
     protected String doInBackground(String...str) { 
      publishProgress("@@0"); 
         //do a bunch of stuff 
         publishProgress(@001); 
         return("true"); 

       } 
       protected void onProgressUpdate(String... str) { 
       //do stuff based on the progress string and eventually 
       myProgressDialog.dismiss(); 
       } 
       protected void onPostExecute(String result) { 
       } 
} 
0

私は何かが欠けていない限り、あなたは自分の場合には、実際には... 2 AsyncTasksを使用することができたとき、私はなぜあなたは一つのケース内のスレッドを使用しているわからないんだけど、他ではAsyncTask最も簡単な方法は、2つの作業ビットを1つのAsyncTaskに結合し、AsyncTaskコールバックでダイアログを作成して破棄することです。疑似コード:

onPreExecute 
    show dialog 
doInBackground 
    do internet stuff 
onPostExecute 
    update views 
    close dialog 

独自のAsyncTaskでビューを更新しようとする理由はありますか?ビューを更新する場合は、おそらくUIスレッドで作業する必要があります。

+0

私はインターネットへの検証に使用している1つのスレッドに使用できます。検証が完了したら、asynctaskでlistviewに表示するために、インターネットからすべてのリストを取得する必要があります。 – Faren

関連する問題