我有一个现有的代码,其具有用于某些请求 - 响应一个异步任务。 在后执行的方法它的解析数据集到一些分贝。
现在我需要以这样的方式,在应用程序启动,得到的数据通过一个下载一个修改此代码。 即我需要执行任务A,然后在它的全面完成(甚至设置数据)我要开始任务B等周边12个任务。
注:我需要完成开始下一个任务之前“后执行”的可能。
我不知道如何做到这一点。 请建议。
我有一个现有的代码,其具有用于某些请求 - 响应一个异步任务。 在后执行的方法它的解析数据集到一些分贝。
现在我需要以这样的方式,在应用程序启动,得到的数据通过一个下载一个修改此代码。 即我需要执行任务A,然后在它的全面完成(甚至设置数据)我要开始任务B等周边12个任务。
注:我需要完成开始下一个任务之前“后执行”的可能。
我不知道如何做到这一点。 请建议。
实现取决于您的要求。
如果每次调用后,你需要更新你的UI,你可以下载并保存在数据doInBackground()
并在更新onPostExecute()
如果你想更新你的UI只是一次,然后下载所有数据的内循环中doInBackground()
并保存你的数据在数据库只存在,最后打电话给你onPostExecute()
只有一次。
如果有无关更新UI,那么你可以简单地使用Thread
。
注: AsyncTask
的执行顺序将只有上述串行 HoneyComb
下方,这将是平行的。
你可以做到这一点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);
现在exection顺序将是一个 - >乙 - > C。;
这一次变得有点凌乱..
配置的AsyncTask与SERIAL_EXECUTOR确实会迫使背景逻辑的串行执行 ,也就是逻辑包含在doInBackground()内调用。
SERIAL_EXECUTOR 不作任何保证,而当onPostExecute()将被调用 。
执行一组的AsyncTask在SERIAL_EXECUTOR模式可能会导致任务的任务B的doInBackground() 之后的执行onPostExecute()
如果是后者的需求是不是你的系统是至关重要的,只要使用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更新开始下一个之前完成。
另一种方式,我可能会更喜欢,是管理日在内部执行ATT后台任务在一个线程中整个任务流程 - “乙 - ”ç....,并在两者之间,问题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..
}
}
希望能帮助到你。