그래서 아래 코드를 AsyncTask 안에 넣고 7 개의 다른 비동기 HTTP 요청을 호출하려고합니다. 모든 것이 잘 작동하며, 동시에 7 개의 execute() 메서드가 모두 시작됩니다 (몇 밀리 초가 걸립니다.).Android에서 여러 개의 동시 HTTP 요청
불행히도이 방법으로 걸리는 시간은 aprox입니다. 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 스레드에서 직접 시도하겠습니다. 하지만 서비스에서 사용할 수는 없지만 응용 프로그램의 요구 사항에 맞지 않습니다. 서버 측에서도 문제가있는 것처럼 보입니다. 서버를 전환 할 때 며칠 후에 다시 확인해 보겠습니다. –
죄송합니다, 당신 말이 맞아요, 모든 경기 시작 전. 스레드 풀 스레드에서 코드를 실행하려면 Runnable을 확장하는 개체의 run() 메서드로 코드를 캡슐화해야합니다. run()의 모든 내용은 동일한 스레드에서 실행됩니다. 너무 많은 코드가 동일한 스레드에서 시작한다면 코드를 분리해야합니다. 서비스가 귀하의 필요를 충족시키지 않는 이유는 분명하지 않지만 동의합니다. –