0

그래서 아래 코드를 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()); 

    } 
} 

답변

0

이 문제를 되돌아 보면 나는 더 많은 정보를 추가하려고합니다.

먼저 응용 프로그램에서 요구 한 사용 사례는 매우 지연되고 성 가시 었습니다 (하지만 헤이 클라이언트, 할 수있는 작업 ...). 조 (Joe)가 위에서 말했듯이, 저는 지금 백만 년 동안 비동기에 관한 데이터를 다운로드하지 않을 것입니다. 가능한 경우 필요한 데이터를 다운로드하기 위해 일종의 서비스를 사용해야합니다.

두 번째로 비동기가 아닌 RoboSpice 라이브러리 (캐싱도 제공)를 사용했습니다. 여전히 서비스를 실행하는 것만 큼 좋지는 않지만 베어 본 버전보다 훨씬 최적화되어 있습니다. 그걸 확인하고 싶을지도 몰라.

0

는 즉석 몰라 ,하지만 난 관찰 :

    restartAllCoreThreads 무엇
  1. , 왜 당신이 생성자를 호출하는? 먼저 스레드를 시작하지 마십시오 (그리고 LinkedBlockingQueue <가 공간을 절약 해줍니다).
  2. AsyncTask에서 이것을 실행해야합니까? 스레드 풀의 스레드는 UI 스레드에서 실행되지 않으며 UI 스레드를 실행하면 AsyncTask의 주요 이점이됩니다. 이 실제로 백그라운드에서이 모든 작업을 수행하려면 IntentService를 사용하십시오.
+0

1. PrestartAllCoreThreads입니다. 별도의 스레드에서 모든 메서드를 시작할 수있는 방법이 필요했습니다. 집행자에게 맡긴다면 집행관에게 맡기지 않습니다. 때로는 동일한 스레드에서 2 개의 메소드를 실행합니다. 이 상황에서 스레드의 수는별로 없기 때문에 완벽합니다. 2. AsyncTask에 없을 수 있습니다. UI 스레드에서 직접 시도하겠습니다. 하지만 서비스에서 사용할 수는 없지만 응용 프로그램의 요구 사항에 맞지 않습니다. 서버 측에서도 문제가있는 것처럼 보입니다. 서버를 전환 할 때 며칠 후에 다시 확인해 보겠습니다. –

+0

죄송합니다, 당신 말이 맞아요, 모든 경기 시작 전. 스레드 풀 스레드에서 코드를 실행하려면 Runnable을 확장하는 개체의 run() 메서드로 코드를 캡슐화해야합니다. run()의 모든 내용은 동일한 스레드에서 실행됩니다. 너무 많은 코드가 동일한 스레드에서 시작한다면 코드를 분리해야합니다. 서비스가 귀하의 필요를 충족시키지 않는 이유는 분명하지 않지만 동의합니다. –