2011-12-28 8 views
0

여기 checkupdate() 함수는 사용자가 내 응용 프로그램을 사용할 수 있는지 확인합니다. 그래서 두 개의 progressdialog를 표시해야합니다. 서버가 요청 (체크 프로세스) 중이며 동기화 프로세스가 진행 중이고 프로세스가 진행 중일 때 응용 프로그램의로드에 완료. 이제는 두 개의 진행률 대화 상자를 표시 할 수 없으므로 스레드 업데이트 확인 중 첫 번째 메시지 만 이 실행되고 응용 프로그램이 종료됩니다. 귀중한 답변을 기다리고 있습니다.하나의 함수에서 두 개의 스레드를 사용하는 방법은 무엇입니까?

public void CheckUpdate() 
{ 

//----------------Process of checking the updates-------------------------- 

     try 
      { 
      progressDialog = ProgressDialog.show(this, "Wait", "Checking update...", false, true); 
      Thread thr1 = new Thread() 
      { 
       public void run() 
       { 
        int Flag = call.CheckUserUpdate(UsrId); 
        Update = Flag; 
        progressDialog.dismiss(); 
        //stop(); 
        interrupt(); 

       } 
      }; 
      thr1.start(); 
      } 
      catch(final Exception e) 
      { 

      } 
    //---------------Process of Synchronization----------------------------------------------   
      try 
      { 
      progressDialog1 = ProgressDialog.show(this, "Wait", "Synchronizing...", false, true); 
      Thread thr2 = new Thread() 
      { 
       public void run() 
       { 
        if(Update == 1) 
        { 
         SyncData(); 
         final int UpdateFlag = 1; 
         call.UpdateUserUpdate(UsrId, UpdateFlag); 
         progressDialog1.dismiss(); 
        } 
        else 
        { 
         progressDialog1.dismiss(); 
        } 
        progressDialog1.dismiss(); 
       } 
      }; 
      thr2.start(); 
      } 
      catch(final Exception e) 
      { 

      } 
} 

답변

0

새 스레드를 시작하면 다른 스레드가 실행되기 시작합니다. 여기서 프로그램은 두 개의 스레드를 시작하여 main()의 끝에 도달하고 JVM/OS가 실제로는 아주 멀리 실행할 가능성이없는 새로 시작한 스레드를 종료하게합니다.

메인 스레드에서 아무런 작업도하지 않는다고 가정 할 때 작업자 스레드가 작업하는 동안 메인 스레드에 제어권을 부여하는 유휴 루프 (또는 유사)를 추가해야합니다.

0

내가 원하는 것을 정확하게 이해합니까?

귀하의 UI의 activitiy 중 하나

  1. 업데이트 확인 프로세스를 기반으로 업데이트해야 두 ProgressBar를
  2. 동기화 프로세스가

은 당신이 당신의 UI 활동에 handler를 작성하고이를 사용해야있다 업데이트 확인을위한 스레드와 동기화 검사를위한 스레드를 분리하십시오.

둘 모두 프로그레시브를 보냅니다. 같은 주 스레드의 정보 : 다른의

mHandler.obtainMessage(Main_screen.MESSAGE_PGROGRESS_CHANGE_UPDATE, state, -1) 
    .sendToTarget(); 

당신은 ... 당신이 핸들러이처럼 보이는이 당신의 UI 활동에서

mHandler.obtainMessage(Main_screen.MESSAGE_PGROGRESS_CHANGE_SYNCHRINIZATION, state, -1) 
    .sendToTarget(); 

private final Handler mHandler = new Handler() { 
    @Override 
    public void handleMessage(Message msg) { 
     if (DEBUG) 
     Log.i(this.getClass().getSimpleName(), 
      "-> " 
       + Thread.currentThread().getStackTrace()[2] 
        .getMethodName()); 
     switch (msg.what) { 
     case MESSAGE_PGROGRESS_CHANGE_UPDATE: 
     if (DEBUG) 
      Log.i(this.getClass().getSimpleName(), 
       " MESSAGE_PGROGRESS_CHANGE_UPDATE: " + msg.arg1); 

     // do your update of progressbar or whatever here 
     break; 
      case MESSAGE_PGROGRESS_CHANGE_SYNCHRINIZATION: 
     if (DEBUG) 
      Log.i(this.getClass().getSimpleName(), 
       " MESSAGE_PGROGRESS_CHANGE_SYNCHRINIZATION: " + msg.arg1); 

     // do your update of progressbar or whatever here 
     break; 
관련 문제