Android studio口口声声说,我需要申报一个最终变量

标签: Java Android
发布时间: 2017/3/19 18:21:17
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

嘿新在编程中,尤其是在 java 中的 I´m 和 xml 。我想要的游戏, progressbar 显示 time ,剩下要做的任务,但 Android studio口口声声说,我需要声明一个最后的变量使用 i + + 和 mProgressBar.setProgress (i); 因为其在内部类中。但据我所知最后的变量不能更改 it´s 值。我应该改变什么来让代码工作再一次?

@Override
public void onResume() {
    super.onResume();

    View decorView = getWindow().getDecorView();
    decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
            | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
            | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
            | View.SYSTEM_UI_FLAG_FULLSCREEN
            | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
    final ImageView ball = (ImageView) findViewById(R.id.ball);
    ball.setOnTouchListener(new View.OnTouchListener()
    {
        PointF DownPT = new PointF(); // Record Finger Position When Pressed Down
        PointF StartPT = new PointF(); // Record Start Position of 'ball'

        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            int eid = event.getAction();
            switch (eid)
            {
                case MotionEvent.ACTION_MOVE :
                    PointF mv = new PointF( event.getX() - DownPT.x, event.getY() - DownPT.y);
                    ball.setX((int)(StartPT.x+mv.x));
                    ball.setY((int)(StartPT.y+mv.y));
                    StartPT = new PointF(ball.getX(), ball.getY() );
                    break;
                case MotionEvent.ACTION_DOWN :
                    DownPT.x = event.getX();
                    DownPT.y = event.getY();
                    StartPT = new PointF(ball.getX(), ball.getY() );
                    break;
                case MotionEvent.ACTION_UP :
                    // Nothing have to do
                    break;
                default :
                    break;
            }
            return true;
        }
    });
    ProgressBar mProgressBar;
    CountDownTimer mCountDownTimer;
    int i=0;

    mProgressBar=(ProgressBar)findViewById(R.id.progressBartime);
    mProgressBar.setProgress(i);
    mCountDownTimer=new CountDownTimer(3000,1000) {

        @Override
        public void onTick(long millisUntilFinished) {
            Log.v("Log_tag", "Tick of Progress"+ i+ millisUntilFinished); //i needs to be declared as final
            i++; //i needs to be declared as final
            mProgressBar.setProgress(i); //mProgressBar needs to be declared as final

        }


        @Override
        public void onFinish() {
            //Do what you want
            i++;  //i needs to be declared as final
            mProgressBar.setProgress(i); //mProgressBar needs to be declared as final
        }
    };
    mCountDownTimer.start();
}

}

解决方法 1:

因为您正在使用一个内部类,它不能访问自身之外的可变变量。请尝试使用 AtomicInteger 作为,可以设置为决赛,所以你会做这样的事情︰

// Outer class (where I is currently defined)
final AtomicInteger i = new AtomicInteger();

//Inner class (within the onTick function)
i.incrementAndGet();

然后要检索的值使用i.get()

对于您的具体情形实际上可以设置 i 变量内的内部类。

例如

CountDownTimer mCountDownTimer;

final ProgressBar mProgressBar=(ProgressBar)findViewById(R.id.progressBartime);
mProgressBar.setProgress(i);
mCountDownTimer=new CountDownTimer(3000,1000) {
    int i = 0;

    @Override
    public void onTick(long millisUntilFinished) {
        Log.v("Log_tag", "Tick of Progress"+ i+ millisUntilFinished); //i needs to be declared as final
        i++; 
        mProgressBar.setProgress(i); //mProgressBar needs to be declared as final

    }


    @Override
    public void onFinish() {
        //Do what you want
        i++;  
        mProgressBar.setProgress(i); //mProgressBar needs to be declared as final
    }
};

MProgressBar 不需要可变,您可以设置,作为最终变量没有任何问题,它是。

编辑︰ 为什么可以用最后的更新

原因 mProgressBar 可以设置如一场决赛是,它是一个对象,使用 final 变量引用的对象不能改变,但不设置对象内部的最后的任何值可以更改,这就是为什么 setProgress 将工作。然而,与原始变量他们只能设置一次,这是来提高性能。

有好好解释,为什么你不能修改非最终从局部类的本地变量。

局部类可以大多数绝对引用实例变量。他们不能引用非最后的本地变量的原因是因为局部类实例可以保留在内存中,在方法返回后。当该方法返回的本地变量超出范围,所以它们的副本被需要。如果变量不是最后然后方法中的变量的副本可以变化,而在局部类中的副本没有,所以他们会失去同步。

赞助商