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 回答