0

같은 시간에 30 개의 스레드 (AsyncTask)가 실행되었습니다. 그들을 실행하기 전에, 나는 진행 대화 상자를 보여줄 것이다. 스레드가 실행을 마친 후 진행 표시를 닫습니다.모든 스레드를 마친 후 ProgressDialog를 닫는 방법?

모든 스레드를 완료 한 후 ProgressDialog를 해제하는 방법에 대한 제안 사항?

답변

1

정확히 30 개의 스레드를 사용하는 경우 변수를 30으로 초기화하고 모든 작업 완료 후 계수를 1만큼 줄이고 변수가 0인지 확인하십시오. 0이면 모든 작업이 완료되었음을 나타냅니다. 그래서 당신은 ProgressDialog를 닫을 수 있습니다.

+0

하나가 지속적으로 UI 스레드를 차단하지 않는 것이 좋습니다 카운터를 확인하기 위해 루프를 실행해야합니다 호출 할 수 있습니다. – Akhil

+1

비동기 작업의 onPostexecute()에 쓰기 만하면 안됩니다. 그래서 그것은 단지 30 시간을 체크 할 것입니다. 즉, 모든 비동기 작업에 대해 한 번 – Ishu

+0

도 변수가 모든 스레드간에 공유되어야한다고 생각하십니까? – thalsharif

1

가장 좋은 방법은 AsyncTask()을 사용하여 작업을 실행하고 onPOstExecute()의 대화 상자를 닫는 것입니다. 이렇게하면 작업이 완료되고 ProgressDialog가 완료됩니다. 여전히 스레드를 계속 사용하려면 스레드가 완료 될 때마다 발생하는 사용자 지정 리스너를 추가해야하며 스레드가 해고 된 횟수 카운터를 유지 관리 할 수 ​​있습니다. 내가 당신에게 코드를 준 수, 더 나은 예는이 링크에 있습니다 : How to know if other threads have finished?

1

당신은 글로벌 클래스 사용할 수 있습니다 : 당신이 때문에 스레드의 동시 액세스의 "동기화"를 사용합니다

public abstract class Global{ 

private static int counter = 30; 
private static ProgressDialog pd; 
private static Activity a; 

public static synchronized void updateCounter(){ 


counter--; 

if(counter<=0){ 

    a.runOnUiThread(new Runnable() { 

    @Override 
    public void run() { 

     pd.dismiss(); 
    } 
    }); 

    } 

} 

} 

을 .

그리고 당신의 주요 활동에

는해서 ProgressDialog를 시작하고 변수를 초기화 :

Global.a = this; 
Global.pd = ProgressDialog.show(this, "Tittle","Message ...", true); 

를 다음 스레드를 시작합니다.

각 스레드의 말에

당신은 다음 Global.updateCounter();

+0

좋은 해결책. 감사. – thalsharif

관련 문제