簡體   English   中英

onPostExecute未被調用

[英]onPostExecute not being called

我在嘗試使用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來獲取所有額外內容。

您的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()將被調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM