需要设计模式建议:包括 AsyncTask
Need design pattern suggestion: AsyncTask included
这是我现在的情况。
Class Foo{
public static boolean isAsyncTask1Done;
public static boolean isAsyncTask2Done;
AsyncTask1(); //in onPostExecute make isAsyncTask1Done= true
AsyncTask2(); //in onPostExecute make isAsyncTask2Done= true
//execute the following method after the above 2 complete.
if (isAsyncTask1Done == true && isAsyncTask2Done == true)
doPostProcessing();
}
现在这个 class 也是一个 activity。也因为 AsyncTask1();和 AsyncTask2();需要一些时间,我已将它们设为异步任务(我可能会将它们设为 intentservice)。
现在我的问题是我应该如何调用 doPostProcessing() ?我只需要在 AsyncTask1() 和 AsyncTask2() 完成时调用它。
谢谢
按照您设置示例的方式行不通。该事件需要在最后 AsyncTask
完成时触发。
启动 AsyncTasks:
new AsyncTask1.execute();
new AsyncTask2.execute();
然后,当最后一个完成后,调用doPostProcessing()
。
编辑:添加了 synchronized
个块。
private boolean asyncTask1Completed = false;
private boolean asyncTask2Completed = false;
private boolean ranPostProcessing = false;
private class AsyncTask1 extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
//......
}
@Override
protected String doInBackground(String... params) {
String result = "result";
//......
return result;
}
@Override
protected void onPostExecute(String result) {
asyncTask1Completed = true;
synchronized(MainActivity.this) {
if (asyncTask2Completed && !ranPostProcessing) {
ranPostProcessing = true;
//Call doPostProcessing once both AsyncTasks are complete:
doPostProcessing();
}
}
}
}
private class AsyncTask2 extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
//......
}
@Override
protected String doInBackground(String... params) {
String result = "result";
//......
return result;
}
@Override
protected void onPostExecute(String result) {
asyncTask2Completed = true;
synchronized(MainActivity.this) {
if (asyncTask1Completed && !ranPostProcessing) {
ranPostProcessing = true;
//Call doPostProcessing once both AsyncTasks are complete:
doPostProcessing();
}
}
}
}
在 task1 的 PostExcecute 中检查 task2 是否已经完成。如果是这样,请执行后处理。如果没有,什么也不做。与 task2 相同,检查 task 1 是否已完成。
并且您需要 .execute() 任务。
而且我敢肯定,如果您仔细查看您的应用程序,就会发现有比这更好的方法。
这是我现在的情况。
Class Foo{
public static boolean isAsyncTask1Done;
public static boolean isAsyncTask2Done;
AsyncTask1(); //in onPostExecute make isAsyncTask1Done= true
AsyncTask2(); //in onPostExecute make isAsyncTask2Done= true
//execute the following method after the above 2 complete.
if (isAsyncTask1Done == true && isAsyncTask2Done == true)
doPostProcessing();
}
现在这个 class 也是一个 activity。也因为 AsyncTask1();和 AsyncTask2();需要一些时间,我已将它们设为异步任务(我可能会将它们设为 intentservice)。
现在我的问题是我应该如何调用 doPostProcessing() ?我只需要在 AsyncTask1() 和 AsyncTask2() 完成时调用它。
谢谢
按照您设置示例的方式行不通。该事件需要在最后 AsyncTask
完成时触发。
启动 AsyncTasks:
new AsyncTask1.execute();
new AsyncTask2.execute();
然后,当最后一个完成后,调用doPostProcessing()
。
编辑:添加了 synchronized
个块。
private boolean asyncTask1Completed = false;
private boolean asyncTask2Completed = false;
private boolean ranPostProcessing = false;
private class AsyncTask1 extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
//......
}
@Override
protected String doInBackground(String... params) {
String result = "result";
//......
return result;
}
@Override
protected void onPostExecute(String result) {
asyncTask1Completed = true;
synchronized(MainActivity.this) {
if (asyncTask2Completed && !ranPostProcessing) {
ranPostProcessing = true;
//Call doPostProcessing once both AsyncTasks are complete:
doPostProcessing();
}
}
}
}
private class AsyncTask2 extends AsyncTask<String, Void, String> {
@Override
protected void onPreExecute() {
//......
}
@Override
protected String doInBackground(String... params) {
String result = "result";
//......
return result;
}
@Override
protected void onPostExecute(String result) {
asyncTask2Completed = true;
synchronized(MainActivity.this) {
if (asyncTask1Completed && !ranPostProcessing) {
ranPostProcessing = true;
//Call doPostProcessing once both AsyncTasks are complete:
doPostProcessing();
}
}
}
}
在 task1 的 PostExcecute 中检查 task2 是否已经完成。如果是这样,请执行后处理。如果没有,什么也不做。与 task2 相同,检查 task 1 是否已完成。
并且您需要 .execute() 任务。
而且我敢肯定,如果您仔细查看您的应用程序,就会发现有比这更好的方法。