启动不同任务的最佳方式

时间:2011-01-31 09:33:29

标签: android

我正在为盲人开发一个应用程序。我必须一直使用TextToSpeech模块,GPS和网络连接。

我需要做这样的查询:咨询GPS,进行JSON调用并调用TextToSpeech(TTS)模块。

我想知道处理与UI主线程通信的不同任务的最佳方法。到目前为止我看到过: 处理程序对象和AsyncTask类。

我必须按顺序启动每个任务,所以我想在从网络中检索数据后调用TTS。所以我使用了“mHandler.post(Runnable)”并在runnable中调用了另一个,依此类推。

但是我已经看到推荐使用AsynTask类。但在这种情况下,我认为我必须为每个任务实现一个不同的类,而我不知道这些任务是否会按顺序执行。类似的东西:

AsyntaskClass1 at1;
AsyntaskClass2 at2;
AsyntaskClass3 at3;

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

这些任务会按顺序执行吗?因为TTS模块必须等待网络任务完成...

感谢您的帮助,

BR.David。

3 个答案:

答案 0 :(得分: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
  }

}

答案 1 :(得分: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
}

答案 2 :(得分:0)

您的示例中无法保证执行顺序。 UI线程将启动3个AsyncTasks。然后这三个任务将同时执行。

如果你想同步执行任务中的代码,你至少要有几种方法来实现它:

将这三个任务合并为一个您已按顺序完成工作的任务,即:

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。然而,这对我来说似乎有点受到尊重......

// Emil H