2016-03-20 19 views
0

私は、firstrollSPの最後のブレースがスコープを終えるまで、私のpushTextが私のEditTextに表示されない場所で遅延が発生しています。 pushGreenTextは、私が書いたUIスレッドのカスタム関数で、XMLでEditTextにSurfaceViewをオーバーレイするテキストを追加します。私は、moveWholeAITurnのシーケンス全体を待つ代わりに、緑色のテキストがすぐに表示されるようにしたいと考えています。それを達成する方法はありますか?私はfirstrollSPをスレッディングしようとしましたが、まだ遅延があり、私は多分pushGreenTextをスレッディングすることを考えましたが、それはまだ答えがわかりません。 UIスレッドがイベントループですので 私の機能の遅延のトラブルシューティング

 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

...ありがとう。メインルーパに戻ってドローイベントを処理するまで、画面を更新することはありません。

メインスレッドでthread.joinを呼び出してはいけません。アプリがフリーズすると、ウォッチドッグタイマーがトリップするとクラッシュする可能性があります。 UIスレッドでジョインを必要としないようにリファクタリングする必要があります。

さらに、私は多くのMainActivity.activityを参照しています。これは巨大なコードの匂いです。静的変数でアクティビティを保持している場合、メモリリークが発生し、アプリケーションを再起動した場合に問題が発生することはほとんど確実です。あなたは決してすべきではない何か。

+0

pushGreenTextがメインアクティビティに属する場合、例外がスローされることなくスレッド内から呼び出す方法は? – Giuseppe

+0

runOnUIThreadの中で実行します(基本的にUIスレッドのハンドラにランナブルをポストしてそこでコードを実行するので、その関数を呼び出すためにUIスレッドにメッセージをポストします)。 –

+0

私はMainActivity.activityの代わりにインタフェースを使用することを考えていましたが、それらを組み合わせるのは難しいです。 – Giuseppe

関連する問題