Как использовать два потока в одной функции? - PullRequest
0 голосов
/ 28 декабря 2011

здесь у меня есть функция 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 голосов
/ 28 декабря 2011

Я правильно понимаю, что вы хотите?

В вашем пользовательском интерфейсе activitiy есть две полосы прогресса, которые должны обновляться в зависимости от

  1. проверка обновлений
  2. процесс синхронизации

, тогда вы должны создать handler в своем пользовательском интерфейсе и использовать два отдельных потока, один для проверки обновлений, а другой для проверки синхронизации

Оба отправляют информацию о своем прогрессе в основной поток, например:

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

в другой у вас есть

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;
0 голосов
/ 28 декабря 2011

Запуск новых потоков приводит к их запуску в другом месте. Ваша программа запускает два потока, достигает конца main() и завершается, в результате чего JVM / OS уничтожает только что запущенные потоки, у которых никогда не было шанса продвинуться очень далеко.

Вам необходимо добавить свободный цикл (или аналогичный), который обеспечивает управление основным потоком, в то время как рабочие потоки выполняют свои функции, предполагая, что в основном потоке не происходит никакой работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...