2011-12-28 89 views
0

這裏我有一個函數checkupdate(),其中我的應用程序檢查更新可用於用戶,所以我需要顯示兩個進度對話框,當服務器在請求時(檢查進程)和其他同步進程正在進行,並且這兩個進程是在應用程序的負載上完成。 現在的問題是我無法顯示這兩個進度對話框,這裏只有第一個線程檢查更新正在運行並且應用程序被終止。 等待您的寶貴答案。如何在一個函數中使用兩個線程?

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. 檢查更新進程更新2個progressbars
  2. 同步過程

,那麼你應該建立在你的UI活動handler和使用兩個單獨的線程一個用於更新檢查,另一個用於同步檢查

兩者都發送它們的進程小號信息像主線程:在其他

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

你有

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

在你的UI活動,你有處理程序看起來像這樣...

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; 
相關問題