【问题标题】:Multiple downloads using asynctask使用 asynctask 进行多次下载
【发布时间】:2012-10-20 22:01:49
【问题描述】:

对于我的应用程序(支持 Android 2.2+),我必须检查很多(大约 700 个)不同网页的 HTML 代码,并从每个网页中检索一个名称。我将所有 URL 存储在一个数组中。

我现在使用单个 Asynctask 并使用如下 URL 遍历数组:

(来自 Asynctask 的 doinbackground 的 sn-p)

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 或互联网带宽(?)。我是否应该在 UI 线程上迭代并执行多个 Asynctask,而不是在一个 Asynctask 中进行迭代?如果有,怎么做?

【问题讨论】:

  • 您是否急于处理这些数据?例如,Google Play 不提供多次下载,而目前,Google Play 一次下载一个应用程序。
  • 用另一种方法查看我编辑的答案

标签: android multithreading android-asynctask


【解决方案1】:

在 API 11 之前,多个 AsyncTask 不会利用多个内核。之后,您可以在每次下载/解析时创建一个 AsyncTask,并使用带有参数 AsyncTask.THREAD_POOL_EXECUTORexecuteOnExecutor 函数让它们并行执行。

来自documentation

执行顺序

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

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


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

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

优点:

  • 您的服务器有更好的带宽
  • 处理能力更强
  • 您的应用可以请求所需的任何数据,而无需下载和解析数百个页面。

不方便:

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

【讨论】:

  • 感谢您的回答,我将从尝试您的第一个建议开始。如果这不让我满意,我会尝试构建自己的服务器,这将花费更多时间,因为我从未做过任何 SQL 或 PHP,就像在此之前我从未制作过应用程序和做过任何 Java 一样(我的第一个)应用程序。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
相关资源
最近更新 更多