2011-01-31 33 views
1

我正在爲盲人開發應用程序。我必須隨時使用TextToSpeech模塊,GPS和網絡連接。推出不同任務的最佳方式

我需要做這樣的查詢:諮詢GPS,做一個JSON調用並調用TextToSpeech(TTS)模塊。

我想知道處理與UI主線程通信的不同任務的最佳方式。到目前爲止我看到: Handler對象和AsyncTask類。

我必須按順序啓動每個任務,所以我想在從網絡中檢索數據後調用TTS。所以我使用了「mHandler.post(Runnable)」,並在裏面運行,調用另一個,等等。

但是我看到,推薦使用AsynTask類。但在這種情況下,我認爲我必須爲每個任務實現不同的類,但我不知道這些任務是否會按順序執行。例如:

AsyntaskClass1 at1; 
AsyntaskClass2 at2; 
AsyntaskClass3 at3; 

at1.execute(); 
at2.execute(); 
at3.execute(); 

該任務是否按順序執行?使TTS模塊必須等待網絡任務完成......

感謝您的幫助,

BR.David。

回答

0

不,他們將幾乎同時執行......即第二的AsyncTask不會等待第一個完成。

我建議你將所有任務放在一個AsyncTask中,並在每個任務完成後使用publishprogress()更新UI。

這樣你就可以在網絡完成後啓動的AsyncTask和UI將得到順序更新

如。

public Object doInBackground(Object... params){ 
    //do task one's stuff 
    publishProgress(1); 
// do task two's stuff 
publishProgress(2) 
    //do task 3 
publishProgress(3) 


} 
public void onProgressUpdate(Integer... int){ 
switch(int[0]){ 
case 1: 
//ui update for task 1 
case 2: 
//ui update for task 3 
case 3: 
//ui update for task 3 
} 
1

你可以用一切單一的AsyncTask類:

private class AsyncTask1 extends AsyncTask<Object, Void, Object> { 

@Override 
protected String doInBackground(Object... args) { 
    // Get a result from the GPS. 

    // Make a network call 

    // Communicate with the TTS 
    } 

@Override 
protected void onPostExecute(Object result) { 
    // Return a result to the main thread 
    // You are only allowed to touch the UI here 
    } 

} 
0

您的示例中不保證執行順序。 UI線程將啓動3個AsyncTasks。這三項任務將同時執行。

如果你想在任務同時執行的代碼,你至少有兩種方法可以acomplish它:

合併三個任務到一個地方,你所訂購的工作順序進行,即:

AsyncTaskCombined task = new AsyncTaskCombined(); 
task.execute(); 

private class AsyncTaskCombined extends AsyncTask<Void, Void, Void> { 
    protected Bitmap doInBackground(Void... urls) { 
     // Initialize classes that implement the work logic 
     Work1 work1; 
     Work2 work2; 
     Work3 work3; 
     // Do the work sequentially... 
     work1.doWork(); 
     work2.doWork(); 
     work3.doWork(); 
    } 
} 

或潛在的,你可以有3種不同的AsyncTask然後在onPostExecute第一個任務的創建和調用第二的AsyncTask,並在第二的AsyncTask的onPostExecute創建和調用的第三個也是最後的AsyncTask。然而,這似乎有點對我來說......

//埃米爾H