我正在为盲人开发一个应用程序。我必须一直使用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。
答案 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