我有一些从JSON服务获取数据的异步任务。 在外部任务的onPreExecute中,我想显示progressDialog。 我想在onPostExecute中解雇它并启动另一个活动。
问题是当我的onPostExecute被调用时仍然存在数据加载,因此下一个活动在没有所需数据的情况下执行。
这是正常行为吗? 有解决方法吗?
class GetDataAsync extends AsyncTask<Integer, Integer, Integer> {
@Override
protected void onPreExecute() {
Log.d("startupflow","GetDataAsync onPreExecute");
progress = new ProgressDialog(Login.this);
progress.setMessage("Loading...");
progress.show();
super.onPreExecute();
}
@Override
protected Integer doInBackground(Integer... params) {
Log.d("startupflow","GetDataAsync doInBackground");
GetData getData = new GetData();
getData.LoadAllData(getApplicationContext(), token, client);
return null;
}
@Override
protected void onPostExecute(Integer integer) {
Log.d("startupflow","GetDataAsync onPostExecute");
if (progress.isShowing()) {
progress.dismiss();
}
Intent intent = new Intent(Login.this, Admin.class);
startActivity(intent);
super.onPostExecute(integer);
}
在GetData类中:
public void LoadAllData(Context context, Token token, OAuth2Client client) {
this.context = context;
this.token = token;
this.client = client;
new AllDataAsync().execute();
}
class AllDataAsync extends AsyncTask<Integer, Integer, Integer> {
@Override
protected Integer doInBackground(Integer... params) {
try {
Log.d("GetData", "In AllDataAsyc, do in background");
GetClientandToken(token, client);
Log.d("GetData", "getcompanyanddatatapstask");
new GetCompanyAndDataTapsTask().execute();
Log.d("GetData", "getslidestask");
new GetSlidesTask().execute();
} catch (Exception e) {
e.printStackTrace();
errorOccurred = true;
}
return null;
}
}
日志:
08-12 11:27:37.515 D/startupflow﹕ GetDataAsync onPreExecute
08-12 11:27:37.562 D/startupflow﹕ GetDataAsync doInBackground
08-12 11:27:37.601 D/startupflow﹕ GetDataAsync onPostExecute
08-12 11:27:40.132 D/startupflow﹕ all data saved
答案 0 :(得分:2)
您的第一个异步是提前启动活动的原因是因为它只启动第二个数据加载异步。 AsyncTasks在不同的线程上工作(因此是异步的),这意味着它们不会相互等待。
您可以做的是在数据加载异步的postExecute中调用函数,以通知您的活动它已完成。例如。添加一个onFinishedLoadingData函数,并在postExecute中调用它。你可以在那里开始你的新活动。