0

したがって、AsyncTask内に以下のコードがあり、7つの異なる非同期HTTPリクエストを呼び出したいと思います。すべてがうまく機能し、7つのexecute()メソッドすべてが同時に開始します(数ミリかかるので、これは素晴らしいことです)。

残念ながら、この方法にかかる時間はおよそです。16秒 すべてのエグゼキュータのものを除外し、元のワーカーAsynctaskでHTTPダウンロードメソッドを呼び出すと、約がかかります。9秒 そのため、実際には、同時ではなく順次の方が時間がかかりません。なぜこれが起こっているのか考えはありますか?たぶんサーバー側に何かありますか?おそらく、エグゼキュータが非同期タスクで開始されたためですか?どうもありがとう !

            MyExecutor executor = new MyExecutor(7, 7, 40000, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>());
            executor.execute(new Runnable()
            {
                @Override
                public void run()
                {
                    try {downloadSplashScreenJsonData();}
                    catch (Exception e)
                    {
                        Log.e(TAG, "Could not download splashscreen data.");
                        e.printStackTrace();
                    }
                }
            });
            // after another 6 executor.execute() calls,
            executor.shutdown();
            executor.awaitTermination(40000, TimeUnit.MILLISECONDS); 

    class MyExecutor extends ThreadPoolExecutor
    {


    public MyExecutor(int corePoolSize, int maximumPoolSize,
            long keepAliveTime, TimeUnit unit,
            BlockingQueue<Runnable> workQueue) {
        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue);
        prestartAllCoreThreads();
        // TODO Auto-generated constructor stub

    }

    @Override
    public void execute(Runnable command) {
        super.execute(command);
        Log.e(TAG, "execute()");
        Log.e(TAG, "no of thr: " + getActiveCount());

    }
}
4

2 に答える 2

0

手に負えないことはわかりませんが、私は観察します:

  1. restartAllCoreThreadsとは何ですか、なぜコンストラクターで呼び出すのですか?必要になる前にスレッドを開始しないでください(LinkedBlockingQueue <>を使用するとスペースを節約できます)。
  2. 本当にこれをAsyncTaskで実行する必要がありますか?スレッドプール内のスレッドはUIスレッドでは実行されず、UIスレッドから実行することがAsyncTaskの主な利点です。これらすべてをバックグラウンドで本当に実行したい場合は、IntentServiceを使用してください。
于 2012-12-06T21:36:47.037 に答える
0

この件を振り返りながら、もう少し情報を追加したいと思います。

まず、アプリケーションで必要とされたユースケースは非常に遅く、面倒でした(しかし、クライアント、何ができるか...)。したがって、ジョーが前述したように、私は100万年後に非同期のデータをダウンロードしません。可能であれば、必要なデータをダウンロードするために何らかのサービスを使用する必要があります。

次に、Asyncsの代わりにRoboSpiceライブラリ(キャッシュも提供)を使用することになりました。それでも、サービスで実行するほど良くはありませんが、ベアボーンバージョンよりもはるかに最適化されています。それをチェックしたいかもしれません。

于 2014-10-28T15:36:10.783 に答える