2016-11-30 1 views
0

실행자 인스턴스에 제출하는 세 가지 태스크가 있습니다. 동기화 프로세스가 끝났음을 알리는 두 가지 작업을 알려야합니다. 그래서 나는이핸들러 스레드에서 결과를 얻을 때까지 기다리십시오.

공용 클래스 SyncManager {

Handler syncHandler; 

public SyncManager() { 
    initHandler(); 
} 

private void initHandler() { 
    HandlerThread ht = new HandlerThread("syncHandler"); 
    ht.start(); 
    syncHandler = new Handler(ht.getLooper()) { 
     private ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(3); 

     public void handleMessage(Message msg) { 

      Future future1 = executor.submit(new ImageRetrieverTask()); 
      Future future2 = executor.submit(new FileRetrieverTask()); 
      Future future3 = executor.submit(new AudioRetrieverTask()); 


      try { 
       Object result1 = future1.get(); 
       Object result2 = future2.get(); 
       Object result3 = future3.get(); 

     // Here i can use EventBus to notify observers of the completion of the sync 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } catch (ExecutionException e) { 
       e.printStackTrace(); 
      } 
     }; 
    }; 
} 

public void performSync() { 
    syncHandler.sendEmptyMessage(1); 
} } 

SyncManager 클래스가 할당되면, 핸들러는 초기화처럼 그것을 달성했다. performSync 메서드가 호출되면 기본적으로 처리기에 메시지를 보내 모든 동기화 관련 작업을 실행자에 추가하여 실행할 수 있도록합니다. 핸들러는 EventBus를 통해 알림을 전달할 수 있도록 선물이 끝날 때까지 기다리는 백그라운드 루프입니다. 처리기는 그래서 내가 백그라운드 스레드에서 기다릴 수 있습니다.

나는이 일을 해커가 된 것처럼 느낍니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

도움을 주시면 대단히 감사하겠습니다. 감사합니다.

+0

를 호출하여 완료 될 때까지 기다릴 수 ThreadPoolExecutor 재사용하지 않습니다. 자세한 내용은이 블로그를 참조하십시오 : https://www.captechconsulting.com/blogs/getting-started-with-rxjava-and-android –

답변

0

경우 당신은 Future 결과를 사용하지 않는 모든 제출 된 작업이이 작업의 이런 종류의 Rxjava를 사용하는 것이 일반적 ExecutorService.awaitTermination(long timeout, TimeUnit unit)

관련 문제