如何在一个函数中使用两个线程?

时间:2011-12-28 06:56:35

标签: java android multithreading thread-safety threadpool

这里我有一个checkupdate()函数,其中我的应用程序检查可供用户使用的更新,因此我需要在服务器处于请求(检查过程)时显示两个progressdialog,并且当同步过程正在进行时我需要显示其他两个进程是在应用程序的负载上完成的。 现在问题是我无法显示这两个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)
            {

            }
}

2 个答案:

答案 0 :(得分:0)

启动新线程会导致它们开始在其他地方执行。你的程序在这里启动两个线程,到达main()的末尾并退出,导致JVM / OS终止你从未真正有机会跑到很远的新启动的线程。

你需要添加一个空闲循环(或者类似的),当工作线程转向他们的东西时,它会在主线程上产生控制,假设你没有在主线程上发生任何工作。

答案 1 :(得分:0)

我能理解你想要的吗?

您的UI活动有两个进度条,应根据

进行更新
  1. 更新检查流程
  2. 同步过程
  3. 然后你应该在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;