My 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()
,它仍然执行作业 3doInBackground
。如何等待 onProgressUpdate 完成后再继续?
Update:
在 getData() 方法中,我尝试获取用户的当前位置,这在 doInBackground 中不起作用以及视图中的一些其他信息。我必须这样做,因为作业 1 需要很长时间,并且用户的当前位置可以更改。我需要用户最准确的位置。
我认为,您使用 doInBackground 和publishProgress() 的方式是错误的,但我仍然需要查看方法的代码获取数据() .
后台操作方法应该用于执行某些任务,该任务应该在事件线程之外的其他线程中执行,并且在发布进度方法,您应该执行与事件线程一起使用的任务。因此,如果获取数据()与事件线程无关,请将代码写在后台操作本身。
但是,如果您的要求只是使用这两种方法(如目前),那么您可以添加一个同步块,如下所示:
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();
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)