2016-03-19 8 views
0

Ich rufe diese Funktion aus dem onTouchEvent meines Android-SurfaceView. Die Funktion pushGreenText ist eine benutzerdefinierte Funktion, die ich schrieb, die einen String in einen EditText schiebt, der Teil meiner XML-Überlagerung für das SurfaceView ist. Es sieht für mich so aus, als ob die ganze Arbeit auf dem UI-Thread ausgeführt wird. Es gibt ein Verhalten, das mir fremd ist, sehe ich. Aus irgendeinem Grund sehe ich den Text nicht als gedrängt bis nach der Ausführung von FirstRollSP und außerhalb des Bereichs. Was ich versuche zu erreichen, ist eine Situation, in der ich den Text sofort als verschoben sehe, ohne zu warten, bis die letzte geschweifte Klammer von firstRollSP fertig ist. An allen anderen Stellen im Code funktioniert pushGreenText sofort, aber aus irgendeinem Grund gibt es in dieser Funktion die Verzögerung.Fehlerbehebung für eine Verzögerung des UI-Threads

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

keine Antwort, aber bewegend 'Random mRng = new Random();' aus dem 'while' Schleife besser sein kann auf jeder Schleife das' mRng' Objekt als neu zu erstellen. – Tigger

Antwort

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

Das könnte die Lösung sein. Ich frage mich auch, ob die Verwendung eines Threads und das Hinzufügen des Threads dazu beitragen können, die Verzögerung etwas zu verringern. – Giuseppe

+0

Ja. Du kannst einen Thread neu schreiben und im Thread schlafen. –

Verwandte Themen