2013-08-13 3 views
0

향상된 for 루프 및 switch 문을 사용하여 다양한 AsyncTask를 트리거합니다. 어떤 AsyncTask가 compeleted 될 때까지 기다릴 루프의 각 반복을 어떻게 멈출 수 있습니까? 스레드를 생성하고 각 AsyncTask가 완료 될 때까지 기다리거나 조인/알림을 알리려고했지만 UI를 멈추게했습니다. AsyncTask를 뭔가를향상된 for 루프 일시 중지

편집을 반환 할 때까지

new MyAsyncTask().execute().get(); 

이 코드를 일시 중지 : 다음은 내 코드 ... 당신은 AsyncTask를 호출하면

for (Integer integer : sequence) { 

    switch (integer) { 
     case 1: // Async process 
      break; 
     case 2: // Async process 
      break; 
     case 3: // Async process 
      break; 
     case 4: // Async process 
      break; 
     default: break; 


     } 

     //Need magic solution here... 

    } 

답변

0

루프는 좋지 않습니다. 각 AsyncTask() 후에 'finish'콜백을 추가하십시오. 이런 종류의 코드를 만듭니다. 체인에 추가 된 마지막 항목을 저장할 수 있으므로 체인에 새 항목을 추가 할 수 있습니다.

0

,과 같이 .get()를 사용하는 또 다른이 옵션은 for 루프를 자체 AsyncTask에 던져 backgrounding이되도록 UI와 상호 작용할 수 있도록합니다.

0

그렇게하는 것은 좋은 디자인 선택이 아닙니다. UI 스레드를 절대로 차단하면 안됩니다. 그렇지 않으면 악명 높은 ANR 오류 메시지가 표시됩니다.

AsyncTask 클래스를 사용하려면 사용되는 방식으로 사용하십시오. 이름에서 알 수 있듯이 AsyncTask은 비동기 백그라운드 작업 (및 짧은 작업)에서 사용되지만 주 스레드를 실행과 동기화하여 전체 목적을 달성하지 못합니다.

doInBackground()에서 배경 작업을 수행 한 다음 onPostExecute()에 UI 스레드에 알립니다. 이 메서드는 UI 스레드에서 실행되도록 보장되므로 동시성 문제를 염려 할 필요가 없습니다. onPorgressUpdate()onPreExecute()을 사용하여 AsyncTask에서 UI 스레드에 알릴 수도 있습니다.

더 구체적인 제안을 얻으려면 무엇을 성취하려고하는지 더 많은 힌트를 제공해야합니다.

+0

저는 Simon-like 프로세스와 같은 AsyncTask를 사용하려고합니다. 루프는 각 단추를 반복하는 것입니다 (Integer 값을 기반으로 함). AsyncTask를 사용하여 doInBackground 메서드에서 1 초 동안 절전 모드를 사용하고 onPreExecute와 onPostExecute를 모두 사용하여 UI의 단추 상태를 업데이트합니다. 이 같은 것을 성취 할 수있는 더 좋은 방법이 있습니까? – Jason

+0

자체 스레드의 모든 제어 코드를 이동하고 비동기 적으로 UI를 업데이트하십시오. AsyncTask는 장기 실행 백그라운드 작업을 처리하는 가장 좋은 방법은 아닙니다. 자신 만의 스레드를 사용하고 Handler를 통해 UI 스레드와 통신을 시도하십시오. 가능한 한 UI 스레드를 깨끗하게 유지하고 UI 관련 작업 만 수행하십시오. –