我的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需要很长时间,并且可以更改用户的当前位置。我需要最准确的用户位置。
答案 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;
这可能会对你有帮助。