2014-05-02 3 views
1

Я хочу выполнить запрос в фоновом режиме в своем приложении RAP Eclipse, но без блокировки пользовательского интерфейса. Я после этого руководства: http://eclipse.org/rap/developers-guide/devguide.php?topic=threads.html&version=2.2Выполнение фонового действия в приложении RAP Eclipse

Но без успеха:/

Запрос выполняется, но она всегда блокирует пользовательский интерфейс при вызове. Вот код, который я использую:

   final ServerPushSession pushSession = new ServerPushSession(); 

       Runnable bgRunnable = new Runnable() { 

        public void run() { 

        // schedule the UI update 
        display.syncExec(new Runnable() { 

         public void run() { 

           try { 

            //CODE 

            try { 
             Thread.sleep(5000); 
            } 
            catch (InterruptedException e) { 
             // TODO Auto-generated catch block 
             e.printStackTrace(); 
            } 
           } 
           catch (PartInitException e) { 

            e.printStackTrace(); 
            System.exit(0); 
           } 

           setText("updated"); 
         } 
        }); 

        // close push session when finished 
        pushSession.stop(); 
        } 
       }; 

       pushSession.start(); 
       Thread bgThread = new Thread(bgRunnable); 
       bgThread.setDaemon(true); 
       bgThread.start(); 

Есть ли у кого-нибудь идеи о том, что происходит?

+0

Ugh .. от того, что я знаю, приложения RAP запускают все в одном потоке пользовательского интерфейса, так как оно находится внутри браузера. Было бы неплохо увидеть фактический ответ на этот вопрос. – GGrec

+1

Я не тестировал ваш код, но, поскольку вы принудительно выполняете синхронизацию, ожидая 5 секунд на bgThread, я склонен сказать, что поток пользовательского интерфейса также вынужден ждать. Поскольку синхронизация заставляет целевой поток не возвращаться ни к чему другому, если только последняя синхронизация * не заполнена, в противном случае состояние сохранения не может быть гарантировано. Поэтому, в свою очередь, попробуйте display.asyncExec – dkeck

+0

@dkeck спасибо за ваш ответ! Я пробовал оба без успеха уже ... – rsy

ответ

1

Я узнал. Код, который должен быть выполнен в фоновом режиме, оказался не в нужном месте. Он работал сразу после того, как я удалил Thread.sleep изнутри display.syncExec, и мне даже не пришлось заменять метод syncExec для метода asyncExec. Ниже вы можете найти образец кода, и ваш код может работать, если вы разместите его под комментарием «CODE».

   final ServerPushSession pushSession = new ServerPushSession(); 

      Runnable bgRunnable = new Runnable() { 

       public void run() { 

          try { 


           //CODE 

           try { 
            Thread.sleep(5000); 
           } 
           catch (InterruptedException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
           } 

          } 
          catch (PartInitException e) { 

           e.printStackTrace(); 
           System.exit(0); 
          } 

       // schedule the UI update 
       display.syncExec(new Runnable() { 

        public void run() { 

          setText("updated"); 
        } 
       }); 

       // close push session when finished 
       pushSession.stop(); 
       } 
      }; 

      pushSession.start(); 
      Thread bgThread = new Thread(bgRunnable); 
      bgThread.setDaemon(true); 
      bgThread.start(); 
+0

Я думаю, вы не должны называть 'System.exit (0)' в вашем webapp ... – alphakermit

Смежные вопросы