对于我的应用程序(支持Android 2.2+),我必须检查很多(大约700个)不同网页的HTML代码,并从每个网页中检索单个名称。我把所有的URL都存储在一个数组中。
我现在使用单个Asynctask并使用以下URL进行迭代:
(来自Asynctask的doinbackground的片段)
publishProgress(urls.size());
int a = 0;
for(String code : urls) {
if(!running) return null;
try {
URL url = new URL(code);
HttpURLConnection con = (HttpURLConnection) url.openConnection();
naam_codes.put(readStream(con.getInputStream(), true).get(0), code);
} catch (Exception e) {
running = false;
}
publishProgress(++a);
和readstream是:
BufferedReader reader = null;
ArrayList<String> html = new ArrayList<String>();
try {
reader = new BufferedReader(new InputStreamReader(in, Charset.forName("ISO-8859-1")));
if (snel){
//reading, matching and stuff
}
else {
//other reading, matching and stuff
}
}
} catch (IOException e) {
//pass
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e) {
return null;
}
}
}
return html;
现在我的问题是它必须等待一个下载+匹配完成才能开始新的。应该可以加快速度,对吗?监视一点后,进程似乎没有完全使用CPU或互联网带宽(?)。我应该代替在一个Asynctask中迭代,迭代UI线程并执行多个Asynctasks吗?如果是这样,怎么样?
答案 0 :(得分:2)
多个AsyncTasks在API 11之前不会利用多个核心。之后,您可以为每个下载/解析创建一个AsyncTask,并使用带有参数{{1的executeOnExecutor
函数进行parralelly执行}}
执行顺序
首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改成了一个池 允许多个任务并行运行的线程。从...开始 HONEYCOMB,任务在单个线程上执行以避免常见 并行执行导致的应用程序错误。
如果您真的想要并行执行,可以调用 executeOnExecutor(java.util.concurrent.Executor,Object [])with THREAD_POOL_EXECUTOR。
如果我是你,我会建立自己的服务器(只是一个CRON任务在某处启动PHP脚本+一个MySQL数据库+一个PHP脚本来提供数据)我不会让应用程序进行处理。
让您的服务器执行700下载,解析它们,在数据库中存储您需要的内容。然后让您的应用程序访问您的服务器脚本,该脚本将从您的数据库中选择所需的信息。
优点:
不方便: