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