排除我的功能延迟

时间:2016-03-20 04:25:37

标签: java android delay

我发生了延迟,我的pushGreentText没有显示在我的EditText中,直到最后一个firstrollSP离开作用域。 pushGreenText是我编写的UI线程上的一个自定义函数,它在XML格式的EditText中添加了一个文本,覆盖了SurfaceView。我希望看到绿色文本立即显示,而不是等待整个moveWholeAITurn序列。有办法实现吗?我试过线程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 个答案:

答案 0 :(得分:1)

因为UI线程是一个事件循环。它不会更新屏幕,直到它返回到主循环器并处理绘制事件 - 直到它调用的任何函数退出。

你永远不应该在主线程上调用thread.join。如果你这样做,你的应用程序将冻结,如果它绊倒了看门狗定时器,它可能会崩溃。您需要将其重构为不需要UI线程上的连接。

另外,我看到很多MainActivity.activity。这是一个巨大的代码味道 - 如果您在静态变量中持有活动,您将会发生内存泄漏,并且如果您的应用程序重新启动,您几乎肯定会遇到问题。这是你永远不应该做的事情。