我有一个现有代码,其中有一个Async Task用于某些请求 - 响应。 在post execute方法中,它将解析后的数据设置为某个db。
现在我需要修改此代码,以便在应用启动时逐个下载数据。 即我需要执行任务A,然后完成任务(即使数据已设置)我需要启动任务B,等等大约12个任务。
注意:我需要完成" post execute"以及在开始下一个任务之前。
我不知道该怎么做。 请建议。
答案 0 :(得分:5)
您可以使用myAsyncTask.executeOnExecutor (SERIAL_EXECUTOR)
AsyncTask a = new AsyncTask();
AsyncTask b = new AsyncTask();
AsyncTask c = new AsyncTask();
a.executeOnExecutor (SERIAL_EXECUTOR);
b.executeOnExecutor (SERIAL_EXECUTOR);
c.executeOnExecutor (SERIAL_EXECUTOR);
现在执行顺序将是 - > b - > ℃;
答案 1 :(得分:3)
这个有点乱......
使用SERIAL_EXECUTOR配置AsyncTask确实会强制执行后台逻辑,
也就是说,doInBackground()调用中包含的逻辑。
SERIAL_EXECUTOR 不保证何时调用onPostExecute()。
在SERIAL_EXECUTOR模式下执行一组AsyncTask可能导致任务A的onPostExecute()被执行 执行之后任务B的doInBackground()。
如果后一个要求对您的系统并不重要,只需使用SERIAL_EXECUTOR即可。
但是,如果是这样,您将需要以强制的方式更改您的架构 这种需求。
这样做的一种方式如下:
class MyAsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
// do background work
return null;
}
@Override
protected void onPostExecute(Void args) {
// update UI here
new MyNextAsyncTask.execute(..); // <---------- start next task only after UI update has completed
}
}
也就是说:您将等待一个操作的UI更新完成,然后再开始下一个操作。
我可能更喜欢的另一种方法是管理整个任务流程 在内部执行后台任务的单个线程内A - &gt; B - &gt; C .... 并且,在它们之间,发布UI更新命令并在这些上等待ConditionVariable 任务完成
new Thread() {
ConditionVariable mCondition = new ConditionVariable(false);
void run() {
do_A();
runonUIThread(updateAfter_A_Runnable);
mPreviewDone.block(); // will be release after updateAfterA_Runnable completes!
do_B();
runonUIThread(updateAfter_B_Runnable);
mPreviewDone.block(); // will be release after updateAfter_B_Runnable completes!
etc..
}
}
希望它有所帮助。
答案 2 :(得分:1)
实施取决于您的要求。
如果您在每次通话后都需要更新用户界面,则可以在doInBackground()
中下载并保存数据,并在onPostExecute()
中保存更新。
如果您只想更新一次用户界面,那么请在doInBackground()
内的循环内下载所有数据,并将数据仅保存在数据库中,最后只调用onPostExecute()
一次。
如果它与更新用户界面无关,那么您只需使用Thread
。
注意: AsyncTask
执行顺序仅在 HoneyComb
之上是串行的,并且它将是并行的。