3

我目前正在使用幾個AsyncTasks處理網絡連接的Android應用程序。AsyncTask工作流程

這是建立連接並調用處理麥克風輸入的新任務的第一項任務。

private class establishConnectionTask extends 
     AsyncTask<String, Integer, String> { 

    @Override 
    protected String doInBackground(String... params) { 
     try { 
      // initialize connection 
      initConnection(); 
      MicrophoneTask micTask = new MicrophoneTask(); 
      micTask.execute(""); 
      } 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     return "Executed"; 
    } 

    @Override 
    protected void onPostExecute(String result) { 
     mReadInputTask = new readInputTask(); 
     mReadInputTask.execute(""); 
     super.onPostExecute(result); 
    } 

一切工作正常,連接工作,我可以傳輸數據。 MicrophoneTask也在做這件事。

這裏談到的問題:

onPostExecute方法,我創建一個新的AsyncTask這應該處理所有的網絡輸入。

這是readInputTask的樣子:

private class readInputTask extends AsyncTask<String, Integer, String> 
{ 

    @Override 
    protected void onPreExecute() 
    { 
     Log.d("DEBUG", "pre"); 
     super.onPreExecute(); 

    } 

    @Override 
    protected String doInBackground(String... params) { 
     // blocking readInput method 
      Log.d("DEBUG", "doInBackground"); 
    } 


    @Override 
    protected void onPostExecute(String result) { 
     Log.d("DEBUG", "post"); 
     super.onPostExecute(result); 
    } 
} 

的readInputTask莫名其妙地卡在readInputTask的onPreExecute方法。我得到的唯一結果是「pre」,儘管我也期待「doInBackground」和「post」。

有沒有人看到錯誤或知道這個解決方案?

任何幫助表示讚賞!

+0

我覺得'doInBackground'在日誌行之前拋出一個異常。你有沒有在Logcat中看到任何錯誤? –

+0

不會引發異常。我只看到我的日誌行。 – Al0x

回答

2
mReadInputTask.execute(""); 

當您使用AsyncTask#execute(params),則AsyncTasks串行執行:一前一後。要並行執行AsyncTasks,請使用AsyncTask#executeOnExecutor(...)

從文檔上executeOnExecutor (Executor exec, Params... params)

此方法通常與THREAD_POOL_EXECUTOR用於允許 多任務並行對 的AsyncTask管理線程池運行,但你也可以用你自己的執行人爲自定義 行爲。

+0

非常感謝,現在就開始工作吧!我認爲AsyncTasks是平行的。 – Al0x

+1

@ Al0x是的,他們曾經是。從版本1.6(Donut)到3.0(Honeycomb),AsyncTask默認並行執行(使用ThreadPool)。但是,使用HONEYCOMB開始,任務在單個線程上執行,以避免由並行執行導致的常見應用程序錯誤(取自[AsyncTask(subheading:Order of execution)](http://developer.android.com /reference/android/os/AsyncTask.html))。 – Vikram