onPostExecute未被调用

时间:2014-02-15 02:08:58

标签: java android multithreading android-asynctask

我在尝试使用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来获取所有额外内容。

1 个答案:

答案 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()将被调用。