2016-03-20 3 views
0

У меня есть задержка, когда мой pushGreentText не отображается в моем EditText до тех пор, пока последняя скобка firstrollSP не выйдет из области. pushGreenText - это настраиваемая функция в потоке пользовательского интерфейса, которую я написал, который добавляет текст в мой EditText в XML, который накладывает SurfaceView. Я хочу, чтобы сразу появился зеленый текст, а не ожидал всей последовательности moveWholeAITurn. Есть ли способ сделать это? Я попробовал threading firstrollSP, но все еще есть задержка, и я подумал о том, что, возможно, прошивка pushGreenText, но я не уверен, что это ответ.Устранение задержек в моей функции

Спасибо ...

 static synchronized public void firstRollSP() throws InterruptedException 
     { 
      //Roll for Player and announce 
      mGame.mDice.setDie1(mGame.mDiceFirstRoll.getDie1()); 

      mGame.mDice.setRolled(true); 

      MainActivity.activity.pushTextGreen(Strings.get_First_roll_X_Die1()); 

      //Roll for two and announce 
      Thread one = new Thread() 
      { 
       public void run() 
       { 
        try 
        { 
         Thread.sleep(2000); 

         mGame.mDice.setDie2(mGame.mDiceFirstRoll.getDie2()); 

         while(mGame.mDice.getDie1() == mGame.mDice.getDie2()) 
          mGame.mDice.setDie2((mRng.nextInt(6) + 1)); 

        } 
        catch(InterruptedException e) 
        { 
         Log.d("ACtionUP", "Interupted e"); 
        } 
       } 
      }; 

      one.start(); 

      one.join(); 

      MainActivity.activity.pushTextGreen("Android first roll is " + Integer.toString(mGame.mDice.getDie2())); 

      if(H.initWonFirstRoll()) 
      { 
       MainActivity.activity.pushTextGreen("Player won first roll."); 

       Thread tInitWon = new Thread() 
       { 
        public void run() 
        { 
         try 
         { 
          Thread.sleep(2000); 

          mGame.isFirstRoll = false; 

          mGame.isTurn = true; 

          mGameAI.isFirstRoll = false; 

          mGameAI.isTurn = false; 

          mGame.mDice.sort(); 

          mGame.mDice.setRolled(true); 

          mGame.mDice.setDiceAnimationComplete(true); 

          mGame.mOppDice.init(); 

          mGame.mPossibleIndexes.calcPossibleTriangles(); 

         } 
         catch(Exception e) 
         { 
          Log.d("ACtionUP", "Interupted e"); 
         } 
        } 
       }; 

       tInitWon.start(); 

       tInitWon.join(); 
      } 
      else 
      { 
       MainActivity.activity.pushTextGreen("Android won first roll."); 

       Thread tDroidWon = new Thread() 
       { 
        public void run() 
        { 
         try 
         { 
          Thread.sleep(2000); 

          mGame.isFirstRoll = false; 

          mGame.isTurn = false; 

          mGameAI.isFirstRoll = false; 

          mGameAI.isTurn = true; 

          mGameAI.mDice.init(); 

          mGame.mOppDice.init(); 

          mGame.mDice.sort(); 

          mGameAI.mDice.setDie1(mGame.mDice.getDie1()); 

          mGameAI.mDice.setDie2(mGame.mDice.getDie2()); 

          mGame.mOppDice.setDie1(mGame.mDice.getDie1()); 

          mGame.mOppDice.setDie2(mGame.mDice.getDie2()); 

          Thread.sleep(2000); 

          mGameAI.mPossibleIndexes.calcPossibleTrianglesAI(); 

         } 
         catch(InterruptedException e) 
         { 
          Log.d("ACtionUP", "Interupted e"); 
         } 
        } 
       }; 

       tDroidWon.start(); 

       tDroidWon.join(); 

       if(mGameAI.mPossibleIndexes.anyPossibles()) 
       { 
        moveWholeTurnAI(); 
       } 
       else 
       { 
        H.endTurnAI(); 
       } 
      } 
     } 

ответ

1

Поскольку поток UI представляет собой цикл событий. Он не будет обновлять экран до тех пор, пока он не вернется в основной петлитель и не обработает событие рисования, пока какая-либо функция из вас не вызовет выходы.

Вы никогда не должны называть thread.join основной темой. Ваше приложение замерзнет, ​​если вы это сделаете, это может привести к сбою, если он отключит сторожевой таймер. Вам нужно реорганизовать его, чтобы не требовать объединения в потоке пользовательского интерфейса.

Кроме того, я вижу много MainActivity.activity. Это огромный запах кода - если вы удерживаете активность в статической переменной, у вас будут утечки памяти, и вы почти наверняка будете иметь проблемы, если ваше приложение будет перезапущено. Его то, что вы никогда не должны делать.

+0

Если pushGreenText относится к основной деятельности, то как вызвать ее из потока без исключения исключения? – Giuseppe

+0

Вы делаете это внутри runOnUIThread (который в основном отправляет runnable обработчику в потоке пользовательского интерфейса и запускает там код. Таким образом, вы отправляете сообщение в поток пользовательского интерфейса для вызова этой функции). –

+0

Я думал, что альтернатива MainActivity.activity - использовать интерфейс, однако их сложнее собрать. – Giuseppe

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