使用asynctask进行多次下载

时间:2012-10-20 22:01:50

标签: android multithreading android-asynctask

对于我的应用程序(支持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吗?如果是这样,怎么样?

1 个答案:

答案 0 :(得分:2)

多个AsyncTasks在API 11之前不会利用多个核心。之后,您可以为每个下载/解析创建一个AsyncTask,并使用带有参数{{1的executeOnExecutor函数进行parralelly执行}}

来自documentation

  

执行顺序

     

首次引入时,AsyncTasks在单个后台线程上串行执行。从DONUT开始,这被改成了一个池   允许多个任务并行运行的线程。从...开始   HONEYCOMB,任务在单个线程上执行以避免常见   并行执行导致的应用程序错误。

     

如果您真的想要并行执行,可以调用   executeOnExecutor(java.util.concurrent.Executor,Object [])with   THREAD_POOL_EXECUTOR。


如果我是你,我会建立自己的服务器(只是一个CRON任务在某处启动PHP脚本+一个MySQL数据库+一个PHP脚本来提供数据)我不会让应用程序进行处理。

让您的服务器执行700下载,解析它们,在数据库中存储您需要的内容。然后让您的应用程序访问您的服务器脚本,该脚本将从您的数据库中选择所需的信息。

优点:

  • 您的服务器具有更好的带宽
  • 它具有更强的处理能力
  • 您的应用可以请求他们需要的任何数据,而不是下载&amp;解析数百页。

不方便:

  • 您可能会在使新数据可用时产生一点延迟(取决于您的CRON任务的执行时间和更新数据库的执行时间)