0

所以,我在 AsyncTask 中有下面的代码,并且想要调用 7 个不同的异步 HTTP 请求。一切正常,所有 7 个 execute() 方法同时启动(花几毫秒,这很棒)。

不幸的是,这种方法所花费的时间是大约。16 秒。如果我排除所有执行程序的内容并在原始工作程序 Asynctask 上调用 HTTP 下载方法,则需要 aprox。9 秒。因此,实际上按顺序而不是并发花费的时间更少。任何想法为什么会发生这种情况?也许服务器端的东西?也许是因为执行程序是在 Asynctask 上启动的?非常感谢 !

            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

当我回顾这件事时,我想补充一些信息。

首先,应用程序所需的用例非常迟钝且繁琐(但是,客户,您能做什么……)。所以就像 Joe 上面所说的那样,我现在不会在一百万年内下载 Asyncs 上的数据。如果可能的话,应该使用某种服务来下载所需的数据。

其次,我最终使用了 RoboSpice 库(它还提供缓存)而不是 Asyncs。它仍然不如在 Service 上运行,但它比准系统版本优化得更好。可能想检查一下。

于 2014-10-28T15:36:10.783 回答
0

不知道,但我观察到:

  1. 什么是restartAllCoreThreads,为什么要在构造函数中调用它?不要在需要线程之前启动线程(LinkedBlockingQueue<> 会节省空间)。
  2. 你真的需要在 AsyncTask 中运行它吗?Threadpool 中的线程不在 UI 线程上运行,而在 UI 线程之外运行是 AsyncTask 的主要优势。如果您真的想在后台执行所有这些操作,请使用 IntentService。
于 2012-12-06T21:36:47.037 回答