等待publishProgress完成后再继续执行doInBackground AsyncTask android

时间:2013-10-04 05:01:06

标签: android android-asynctask

我的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()时,它仍在doInBackground执行作业3。如何在继续之前等待onProgressUpdate完成?

更新
在getData()方法中,我试图获取用户的当前位置,该位置不能在doInBackground中工作,也可以从视图中获取其他一些信息。我必须这样做,因为作业1需要很长时间,并且可以更改用户的当前位置。我需要最准确的用户位置。

3 个答案:

答案 0 :(得分: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();
        }
    }

}

答案 1 :(得分:0)

使用标志_publishFinished = false;然后调用发布进度然后在doInBackgrnd中忙着等待

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

结尾 onProgressUpdate调用

_publisFinish = true;

答案 2 :(得分: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;

这可能会对你有帮助。