2016-01-13 94 views
2

我有兩個函數可以執行SOAP調用,另一個函數可以從兩個SOAP調用中創建一個List。我在計算如何等待這兩個SOAP調用完成並運行第三個函數。AsyncTask,Android中的線程

Function A = SOAP (independent of B) 
Function B = SOAP (independent of A) 
Function C = Making a List from A & B (dependent on both A & B) 
Function D = displaying using List from C 

我目前的解決方案是把一個在的AsyncTask,B在A的onpostexecute,和C在不工作B的onpostexecute。我試着在每個函數的開始和結尾放置兩個日誌。它開始記錄B的功能,然後A就完成了它的兩個日誌,其結果是亂七八糟的。

我正在考慮將A & B放在單獨的線程中並在完成後加入它們。然後把C放在異步任務或另一個線程中。但我擔心這會導致D問題(顯示來自C的列表),因爲賽車問題使用我當前的解決方案與異步任務。

回答

2

嗯,這是一個邏輯順序和併發性的問題。試試這個方法:

public void process() { 
     Thread funcAThread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       startFunctionA(); 
      } 
     }); 

     Thread funcBThread = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       startFunctionB(); 
      } 
     }); 

     try { 
      funcAThread.start(); 
      funcBThread.start(); 
      funcAThread.join(); 
      funcBThread.join(); 
      startFunctionC(); 
      startFunctionD(); 
     } catch (InterruptedException e) { 
      Log.getStackTraceString(e); 
     } 
    } 

注:確保到UI意見(尤其是在功能d)所有的呼叫使用Activity.runOnUiThread(Runnable runnable)UI線程內部處理。

注意2:如果functionC很費時,也可以從線程調用它,以便它保持您的應用程序響應(這非常重要)。因此,基於以上我的代碼:

try { 
     funcAThread.start(); 
     funcBThread.start(); 
     funcAThread.join(); 
     funcBThread.join(); 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       startFunctionC(); 
       //once completed, call UI thread for D ! 
       runOnUiThread(new Runnable() { 
        @Override 
        public void run() { 
         startFunctionD(); 
        } 
       }); 
      } 
     }).start(); 
    } catch (InterruptedException e) { 
     Log.getStackTraceString(e); 
    } 

注3:我不會推薦的AsyncTask使用。不是因爲它是不好的(當然不是),而是因爲它們是用於操作,你需要定義一個開始,要在背景與UI線程上執行定期更新最後一些其他處理的長時間作業一旦主要長期操作完成,將執行操作完成。 您可以使用一個AsyncTask來執行所有操作,但是您將失去使用兩個可以利用多核CPU的併發線程的優勢,因此可以更快地處理數據/執行操作。此外,我相信在某些Android版本中,您當時只能使用一個AsyncTask。檢查此答案以獲取更多信息:https://stackoverflow.com/a/4072832/3535408。所以你最好用線程:更清晰,更簡單,更快。

+0

對於什麼是值得的,AsyncTasks可以並行運行。使用'task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);'。然而,這是鎖定到更高版本的Android版本。 – Knossos

+0

@Knossos完全正確,這就是爲什麼我在我的** Note3 **中包含一個鏈接,它提供了關於運行並行AsynTasks問題的很多細節;-) – Mackovich

+0

糟糕!錯過了。我很抱歉! – Knossos

2

運行A & B在同一時間通過他們的單獨AsyncTask

onPostExecute函數A & B中,調用記錄該任務已運行的函數。

在這個回調函數,選中這兩個A & B是否已完成,然後在另一個AsyncTask運行C

例子:

在每一個的AsyncTask:

onPostExecute(Void result) { 
    mCallback.onTaskCompleted(this.class); 
} 

在你的類調用您AsyncTasks:

onTaskCompleted(Class task) { 
    if(task instanceof AsyncTaskA) mTaskA = true; 
    else if(task instanceof AsyncTaskB) mTaskB = true; 

    if(mTaskA && mTaskB) { 
     runTaskC(); 
    } 
}