因此,我在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());
}
}
1.它是PrestartAllCoreThreads。我想要一種方法來在單獨的線程中啓動每個方法。如果我把它留給執行者,它不會。有時它在同一個線程上執行2個方法。在這種情況下,完全沒問題,因爲我沒有方法=沒有線程。 2.可能不在AsyncTask中。我會直接在UI線程上嘗試。但是,不,我不能在一個服務中使用它,它只是不適合應用程序的需求。 它似乎也是服務器端的問題。切換服務器後幾天我會回來查看。 –
對不起,您是對的,prestartAllCoreThreads。 要在線程池線程中運行代碼,您需要將其封裝在擴展Runnable的對象的run()方法中。 run()中的所有內容都在同一個線程上運行。如果你的代碼太多是從同一個線程開始的,那麼你需要分解你的代碼。 我不清楚爲什麼服務不符合您的需求,但我接受。 –