我正在使用增强的for循环和switch语句来触发各种AsyncTasks。如何暂停循环的每次迭代以等待任何给定的AsyncTask被匹配?我试图在每个AsyncTask完成时产生一个线程并等待/加入/通知,但我只是一直在冻结UI。以下是我的代码片段......
for (Integer integer : sequence) {
switch (integer) {
case 1: // Async process
break;
case 2: // Async process
break;
case 3: // Async process
break;
case 4: // Async process
break;
default: break;
}
//Need magic solution here...
}
答案 0 :(得分:0)
当您调用AsyncTask时,请使用.get()
,如下所示:
new MyAsyncTask().execute().get();
这将暂停代码,直到AsyncTask返回
编辑:另一种选择是将for循环放在自己的AsyncTask中,这样它也可以进行后台处理,允许你与UI进行交互
答案 1 :(得分:0)
你正在做的事情不是一个好的设计选择。你永远不应该阻止UI线程,否则你将面对臭名昭着的ANR错误消息。
如果您想使用AsyncTask
类,请尝试按照它应该使用的方式使用它。正如名称所示,AsyncTask
用于异步后台操作(以及简短的后台操作!),但是您正在将主线程与其执行同步,从而无法实现其整个目的。
让您的后台工作在doInBackground()
,然后通知onPostExecute()
中的UI线程。保证在UI线程上执行此方法,因此您不必担心并发问题。您还可以使用onPorgressUpdate()
和onPreExecute()
从AsyncTask
通知UI主题。
有关更具体的建议,您应该向我们提供更多关于您要实现的目标的提示。
答案 2 :(得分:0)
循环不是一个好选择。在每个AsyncTask()之后添加一个'finish'回调。创建这种代码链。您可以保存链中添加的最后一个,以便在链中添加新项目。