0

HTMLの解析が必要なアプリを開発しています。したがって、私は現在、次のように AsyncTaskLoader で jsoup を使用しています (例):

@Override
public Boolean loadInBackground() {
    try {
        Connection.Response response = Jsoup.connect(getContext().getString(R.string.url_login))
                .data("id", account_id, "password", account_password)
                .timeout(5000)
                .method(Connection.Method.POST)
                .execute();

        String cookie = response.cookie("JSESSIONID");

        Document document = Jsoup.connect(getContext().getString(R.string.url_schedule))
                .cookie("JSESSIONID", cookie)
                .get();

            Element table = document.select("table").first();
            if (table != null) {
                databaseHandler.openDatabase();
                databaseHandler.getDatabase().beginTransaction();
                try {
                    for (Element row : table.select("tr")) {
                        Elements columns = row.select("td");
                            addItem(columns, DatabaseHandler.getTableName());
                    }
                    databaseHandler.getDatabase().setTransactionSuccessful();
                } finally {
                    databaseHandler.getDatabase().endTransaction();
                }
                databaseHandler.closeDatabase();
            }
    } catch (IOException e) {
        e.printStackTrace();
    }
    return null;
}

これはほんの1ページのスクレイプであり、それらの数はほとんどありません. そして、速度があまり良くないことに気付きました。そのため、マルチスレッド化を検討し、これらすべてのページを別々のスレッドで同時に解析して、高速化するように言われました。今、私はいくつかの質問があります:

  1. AsyncTaskLoader または AsyncTask を引き続き使用する必要がありますか、それともそのソリューションに他に (より良い) ものがありますか? このことのベストプラクティスは何かを知りたいです。
  2. Androidでマルチスレッドを行う方法のチュートリアル/例を教えてもらえますか?

ありがとう ;)

4

1 に答える 1

0

AsyncTask はこれに適しています。ただし、AsyncTask のドキュメントによると、executeOnExecutor メソッドを使用しない限り、デフォルトのモデルは「一度に 1 つのタスク」のままです。

http://developer.android.com/reference/android/os/AsyncTask.htmlから:

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

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

解析するページがいくつあるかは言わなかったので、同時タスクの数を妥当な数に制限してください。

于 2014-08-31T19:42:56.517 に答える