2016-03-19 15 views
0

私はAndroid SurfaceViewのonTouchEventからこの関数を呼び出しています。関数pushGreenTextは、SurfaceViewのXMLオーバーレイの一部であるEditTextに文字列をプッシュするカスタム関数です。すべての作業がUIスレッドで実行されているように見えます。私が見ている私には奇妙な行動があります。何らかの理由で、firstRollSPが実行されスコープから外されるまで、テキストがプッシュされているとは見えません。私が達成しようとしているのは、firstRollSPの最後の中括弧が終了するのを待つことなく、すぐにプッシュされたテキストを見る状況です。コード内の他の場所では、pushGreenTextは即座に動作しますが、何らかの理由でこの関数に遅延があります。UIスレッドの遅延のトラブルシューティング

static synchronized public void firstRollSP() throws InterruptedException { 
       mGame.mDice.setDie1(mGame.mDiceFirstRoll.getDie1()); 

       mGame.mDice.setRolled(true); 

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

       H.waitms(2000); 


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

       while(mGame.mDice.getDie1() == mGame.mDice.getDie2()) 
       { 
        Random mRng = new Random(); 

        int dProposedDie = mRng.nextInt(6) + 1; 

        mGame.mDice.setDie2(dProposedDie); 
       } 

       MainActivity.activity.pushTextGreen("Android rolled " + Integer.toString(mGame.mDice.getDie2())); 

       H.waitms(2000); 

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

        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(); 
       } 
       else 
       { 
        MainActivity.activity.pushTextGreen("Android won first roll."); 

        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()); 

        H.waitms(2000); 

        mGameAI.mPossibleIndexes.calcPossibleTrianglesAI(); 

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

ない答えが、 'ランダムmRngは=新しいランダム()移動;' 'while'ループの外に各ループに' mRng'オブジェクトを再作成するよりも良いかもしれに。 – Tigger

答えて

1
static synchronized public void firstRollSP() throws InterruptedException { 

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

    mGame.mDice.setRolled(true); 

    MainActivity.activity.pushTextGreen(Strings.get_First_roll_X_Die1()); 
    new Handler().postDelay(new Runnable(){ 
     //your code here. 
    },2000); 

} 
+0

それは解決策かもしれません。私はまた、スレッドを使用してスレッドに参加することで遅延の一部を緩和するのに役立つかもしれないと思っています。 – Giuseppe

+0

はい。あなたはスレッドを新規に作成し、そのスレッドでスリープできます。 –

関連する問題