2011-12-28 91 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; 
相关问题