我在尝试使用onPostExecute解决这段代码时遇到问题,我是java新手,特别是多线程,所以如果我正在做的是完全错误的话请随时纠正我...需要学习
所以问题在于:
public class DataTask extends AsyncTask<Void, Void, Integer> {
Context context;
DataTask(Context context) {
this.context = context.getApplicationContext();
}
// Global Int for counting how many Tasks have been completed
int asynCount = 0;
ArrayList<String> arr_dataVts=new ArrayList<String>();
ArrayList<String> arr_dataNtm=new ArrayList<String>();
ArrayList<String> arr_dataOdas=new ArrayList<String>();
ArrayList<String> arr_dataMetAll=new ArrayList<String>();
ArrayList<String> arr_dataMet3HrTask=new ArrayList<String>();
ArrayList<String> arr_dataTideTask=new ArrayList<String>();
@Override
protected Integer doInBackground(Void... params) {
//VtsAsyncTask
VtsTask task1 = new VtsTask();
task1.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
//NtmAsyncTask
NtmTask task2 = new NtmTask();
task2.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
//OdasAsyncTask
OdasTask task3 = new OdasTask();
task3.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
//MetAllTask
MetAllTask task4 = new MetAllTask();
task4.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
//Met3HrTask
Met3HrTask task5 = new Met3HrTask();
task5.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
//TideTask
TideTask task6 = new TideTask();
task6.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
return 1;
}
所有任务按照应执行
执行但是在onPostExecute:
@Override
protected void onPostExecute(Integer result) {
if (asynCount == 6){
//start intents for main activity
System.out.println("asynCount has reached= " + asynCount + " so now starting MainActivity");
Intent intent = new Intent(context, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.putStringArrayListExtra("data1", arr_dataVts);
intent.putStringArrayListExtra("data2", arr_dataNtm);
intent.putStringArrayListExtra("data3", arr_dataOdas);
intent.putStringArrayListExtra("data4", arr_dataMetAll);
intent.putStringArrayListExtra("data5", arr_dataMet3HrTask);
intent.putStringArrayListExtra("data6", arr_dataTideTask);
// context.startActivity(intent);
}else{
//update dialogue
}
}
}
onPostExecute永远不会被调用?我不知道为什么。 我尝试过使用Integers,Void和Booleans让它返回但是不起作用。 所有建议表示赞赏。 编辑:我现在意识到我应该在这里使用Bundle来获取所有额外内容。
答案 0 :(得分:2)
您的DataTask
课程是不必要的。你在后台做的唯一事情是启动其他几个AsyncTask你不需要在自己的AsyncTask中包装所有那些execute()命令,因为它们已经在后台线程中执行,只是因为AsyncTask的性质
您拥有的其他每个任务都需要拥有自己的onPostExecute()
来处理该特定任务的结果并对其执行某些操作。
编辑:
如果将所有操作合并到一个AsyncTask中,以下是一些伪代码:
public class DataTask extends AsyncTask<Void, Void, Integer> {
Context context;
DataTask(Context context) {
this.context = context; // <-- you already have a context, you don't need to call getApplicationContext();
}
@Override
protected Integer doInBackground(Void... params) {
doSomeWork();
doSomeOtherWork();
doYetSomeMoreWork();
//...
}
@Override
protected void onPostExecute(Integer result) {
doSomethingWithThe(result);
}
}
doSomeWork()
等...方法不应该是AsyncTasks,只是常规方法,以便它们按顺序执行。这样,当所有这些都完整时,onPostExecute()
将被调用。