3

私のアプリ (Android 2.2 以降をサポート) では、多数 (約 700) の異なる Web ページの HTML コードをチェックし、各 Web ページから 1 つの名前を取得する必要があります。すべての 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;

今私の問題は、新しいダウンロードを開始する前に、1 つのダウンロードとマッチングが完了するのを待たなければならないことです。これを高速化できるはずですよね?少し監視した後、プロセスは CPU やインターネット帯域幅 (?) を完全には使用していないようです。1 つの Asynctask 内で反復する代わりに、UI スレッドで反復して複数の Asynctask を実行する必要がありますか? もしそうなら、どのように?

4

1 に答える 1

2

複数の AsyncTasks は、API 11 より前に複数のコアを利用しません。その後、ダウンロード/解析ごとに 1 つの AsyncTask を作成executeOnExecutorし、パラメーターを指定した関数を使用してそれらを並列に実行できますAsyncTask.THREAD_POOL_EXECUTOR

ドキュメントから:

実行順序

最初に導入されたとき、AsyncTasks は単一のバックグラウンド スレッドでシリアルに実行されました。DONUT 以降、これはスレッドのプールに変更され、複数のタスクが並行して動作できるようになりました。HONEYCOMB 以降、並列実行によって発生する一般的なアプリケーション エラーを回避するために、タスクは単一のスレッドで実行されます。

本当に並列実行が必要な場合は、THREAD_POOL_EXECUTOR を使用して executeOnExecutor(java.util.concurrent.Executor, Object[]) を呼び出すことができます。


もし私があなただったら、私は自分のサーバーを構築し (どこかで PHP スクリプトを起動する CRON タスク + MySQL データベース + データを提供するための PHP スクリプト)、アプリケーションに処理をさせません。

サーバーに 700 回のダウンロードを実行させ、それらを解析し、必要なものをデータベースに保存します。次に、データベースから必要な情報を取得するサーバー スクリプトにアプリケーションがアクセスできるようにします。

利点:

  • サーバーの帯域幅が向上しています
  • それはより多くの処理能力を持っています
  • アプリは、数百ページをダウンロードして解析する代わりに、必要なデータをリクエストできます。

不便:

  • 新しいデータを利用できるようにするのに少し時間がかかる場合があります (データベースを更新するための CRON タスクの実行期間と実行時間によって異なります)。
于 2012-10-20T22:07:52.410 に答える