0

因此,我在AsyncTask中有下面的代碼,並且想調用7個不同的異步HTTP請求。一切正常,所有7個execute()方法同時開始(給一個毫秒,這很棒)。Android上的多個同時發出的HTTP請求

不幸的是,這種方法花費的時間是多多少少。 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()); 

    } 
} 

回答

0

當我回過頭來看這個問題時,我想添加一些更多信息。

首先,應用程序所要求的用例非常遲鈍和繁瑣(但是,嘿,客戶端,你能做什麼......)。就像喬在上面所說的那樣,我現在不會在一百萬年內下載有關Asyncs的數據。如果可能的話,應該使用某種服務來下載所需的數據。其次,我結束了使用RoboSpice庫(它也提供了緩存)而不是Asyncs。它還不如運行在一個服務上,但它比準系統版本更好地優化。可能想檢查一下。

0

不知道隨便,但我觀察:

  1. 什麼是restartAllCoreThreads,爲什麼你在構造函數中調用它?在需要它們之前不要啓動 線程(並且LinkedBlockingQueue將爲您節省空間)。
  2. 你真的需要在AsyncTask中運行這個嗎?線程池中的線程不會在UI線程上運行,並且運行UI線程是AsyncTask的主要優勢。如果您真的想在後臺完成所有這些操作,請使用IntentService。
+0

1.它是PrestartAllCoreThreads。我想要一種方法來在單獨的線程中啓動每個方法。如果我把它留給執行者,它不會。有時它在同一個線程上執行2個方法。在這種情況下,完全沒問題,因爲我沒有方法=沒有線程。 2.可能不在AsyncTask中。我會直接在UI線程上嘗試。但是,不,我不能在一個服務中使用它,它只是不適合應用程序的需求。 它似乎也是服務器端的問題。切換服務器後幾天我會回來查看。 –

+0

對不起,您是對的,prestartAllCoreThreads。 要在線程池線程中運行代碼,您需要將其封裝在擴展Runnable的對象的run()方法中。 run()中的所有內容都在同一個線程上運行。如果你的代碼太多是從同一個線程開始的,那麼你需要分解你的代碼。 我不清楚爲什麼服務不符合您的需求,但我接受。 –