2

私のAsyncTaskように見える:

private class MyTask extends AsyncTask<String, Void, List<Data>> {
  private volatile UserData userData;
  protected List<Data> doInBackground(String... params) {
      // do some job 1
      publishProgress();
      // wait until the progress finish to update variable.
      if(userData!= null){
        //do some job 2
      }

      //do some job 3

  }

    protected void onProgressUpdate(Void... values) {
        // try to ask user and collect information
        userData= getData();
    }

}

問題は、 を呼び出すとpublishProgress()、 でジョブ 3 が実行されることdoInBackgroundです。続行する前に onProgressUpdate の完了を待つにはどうすればよいですか?

更新:
getData() メソッドで、ユーザーの現在の場所を取得しようとしましたが、これは doInBackground やビューからのその他の情報では機能しません。ジョブ1に非常に長い時間がかかり、ユーザーの現在の場所が変更される可能性があるため、これを行う必要があります。ユーザーの最も正確な場所が必要です。

4

3 に答える 3

2

doInBackground と publishProgress() の使用方法が間違っていると思いますが、メソッドgetData()のコードを確認する必要があります。

doInBackgroundメソッドは、イベント スレッド以外のスレッドで実行するタスクを実行するために使用する必要があり、publishProgressメソッドでは、イベント スレッドで動作するタスクを実行する必要があります。したがって、getData()がイベント スレッドと関係ない場合は、 doInBackground自体にコードを記述してください。

ただし、要件が現在のようにこれらの両方の方法を使用するだけの場合は、以下のように同期ブロックを追加できます。

private class MyTask extends AsyncTask<String, Void, List<Data>> {
  private volatile UserData userData;
  protected List<Data> doInBackground(String... params) {

  synchronize(userData)
  {
      // do some job 1
      publishProgress();
      // wait until the progress finish to update variable.
      if(userData!= null){
        //do some job 2
      }

      //do some job 3
    }
  }

    protected void onProgressUpdate(Void... values) {
        // try to ask user and collect information
        synchronize(userData)
        {
            userData= getData();
        }
    }

}
于 2013-10-04T05:08:56.417 に答える
0

フラグ _publishFinished = false; を使用します。次に、発行の進行状況を呼び出してから、doInBackgrnd でビジー待機を行います

`if(!_publishFinish) 
{Thread.Sleep(200);}`

onProgressUpdate 呼び出しの終了時

_publisFinish = true;
于 2013-10-04T05:05:39.393 に答える
0
private class MyTask extends AsyncTask<String, Void, List<Data>>{


        protected void onPreExecute() {
            // Showing progress dialog before sending http request
            pDialog = new ProgressDialog(YourActivity.this);
            pDialog.setMessage("Please wait..");
            pDialog.setIndeterminate(true);
            pDialog.setCancelable(false);
            pDialog.show();
        }
  private volatile UserData userData;
  protected List<Data> doInBackground(String... params) {
      // do some job 1
      publishProgress();
      // wait until the progress finish to update variable.
      if(userData!= null){
        //do some job 2
      }

      //do some job 3

  }

    protected void onProgressUpdate(Void... values) {
        // try to ask user and collect information
        userData= getData();
    }
    protected void onPostExecute(Void unused) {
            // closing progress dialog
            pDialog.dismiss();
        }

}

pDialog は進行状況ダイアログです。次のように、アクティビティのどこからでも初期化します。

  ProgressDialog pDialog;

これはあなたを助けるかもしれません。

于 2013-10-04T05:15:05.917 に答える