CountDownTimer中的全局变量不会更改

时间:2016-09-02 19:57:09

标签: java android

请协助,我有以下代码,我尝试在不同的地方执行,但结果如下: 1)当放置在on创建时,它会保持重置为60秒 2)当放入onResume时它似乎完美地工作,直到再次按下播放按钮然后它从最后的onPause位置开始倒计时 3)当放入playAgain方法时,它会崩溃

代码: createTimer方法

public void createTimer(){

        countDownTimer = new CountDownTimer(timeRemaining, 1000) {
            @Override
            public void onTick(long l) {

                if (!isFinnish) {
                    timeRemaining = l;
                } else {

                    timeRemaining = 63200;
                }

                countDownText.setText(String.valueOf(l/1000-60));

                if (l <= 61000) {

                    timerTextView.setText(String.valueOf(l/1000) + "s");
                    button0.setEnabled(true);
                    button1.setEnabled(true);
                    button2.setEnabled(true);
                    button3.setEnabled(true);
                    button0.setVisibility(View.VISIBLE);
                    button1.setVisibility(View.VISIBLE);
                    button2.setVisibility(View.VISIBLE);
                    button3.setVisibility(View.VISIBLE);
                    sumTextView.setVisibility(View.VISIBLE);
                    countDownText.setVisibility(View.INVISIBLE);
                }

                if (l/1000 == 30){

                    if (MainActivity.mplayer7 != null) {
                        MainActivity.mplayer7.release();
                        MainActivity.mplayer7 = null;
                    }

                    MainActivity.mplayer7 = MediaPlayer.create(getApplicationContext(), R.raw.halfway);

                    if (MainActivity.muted == false) {

                        MainActivity.mplayer7.setVolume(0.0f, 0.0f);
                    }

                    MainActivity.mplayer7.start();

                }


                if (l/1000 == 5){

                    if (MainActivity.mplayer != null) {
                        MainActivity.mplayer.release();
                        MainActivity.mplayer = null;
                    }

                    MainActivity.mplayer = MediaPlayer.create(getApplicationContext(), R.raw.ticktock);

                    if (MainActivity.muted == false) {

                        MainActivity.mplayer.setVolume(0.0f, 0.0f);
                    }

                    MainActivity.mplayer.start();

                }

            }

            @Override
            public void onFinish() {

                timerTextView.setText("0s");
                timeRemaining = 63200;
                isFinnish = true;

                //Log.i("Score", String.valueOf(score));
                //Log.i("Number of Questions", String.valueOf(numberOfQuestions));
                //Log.i("Percentage", String.valueOf(percentage));
                //resultTextView.setText("You scored: " + Integer.toString(score) + "/" + Integer.toString(numberOfQuestions));

                if (score > 0) {
                    percentage = score * 100 / numberOfQuestions;
                }
                else {
                    percentage = 0;
                }

                button0.setEnabled(false);
                button1.setEnabled(false);
                button2.setEnabled(false);
                button3.setEnabled(false);
                playAgainButton.setVisibility(View.VISIBLE);
                returnToMenu.setVisibility(View.VISIBLE);
                resultDisplayTextView.setVisibility(View.VISIBLE);
                resultTextView.setText(" ");

                if (percentage > 80) {
                    resultDisplayTextView.setText("Fantastic Score! " + Integer.toString(percentage) + "%");

                    if (MainActivity.mplayer3 != null) {
                        MainActivity.mplayer3.release();
                        MainActivity.mplayer3 = null;
                    }

                    MainActivity.mplayer3 = MediaPlayer.create(getApplicationContext(), R.raw.fireworks);

                    if (MainActivity.muted == false) {

                        MainActivity.mplayer3.setVolume(0.0f, 0.0f);
                    }

                    MainActivity.mplayer3.start();

                }
                else if (percentage >= 60 && percentage < 80) {
                    resultDisplayTextView.setText("Great Score! " + Integer.toString(percentage) + "%");

                }
                else if (percentage >= 40 && percentage < 60) {
                    resultDisplayTextView.setText("Average Score! " + Integer.toString(percentage) + "%");

                }
                else if (percentage > 1 && percentage < 40) {
                    resultDisplayTextView.setText("Poor Score! " + Integer.toString(percentage) + "%");

                    if (MainActivity.mplayer4 != null) {
                        MainActivity.mplayer4.release();
                        MainActivity.mplayer4 = null;
                    }

                    MainActivity.mplayer4 = MediaPlayer.create(getApplicationContext(), R.raw.poor);

                    if (MainActivity.muted == false) {

                        MainActivity.mplayer4.setVolume(0.0f, 0.0f);
                    }

                    MainActivity.mplayer4.start();

                }
                else {

                    resultDisplayTextView.setText("You did not play?");

                    if (MainActivity.mplayer5 != null) {
                        MainActivity.mplayer5.release();
                        MainActivity.mplayer5 = null;
                    }

                    MainActivity.mplayer5 = MediaPlayer.create(getApplicationContext(), R.raw.poor);

                    if (MainActivity.muted == false) {

                        MainActivity.mplayer5.setVolume(0.0f, 0.0f);
                    }

                    MainActivity.mplayer5.start();
                }

            }
        };


    }

playAgain Method

public void playAgain (View view) {

        score = 0;
        isFinnish = false;
        numberOfQuestions = 0;
        timerTextView.setText("60s");
        pointsTextView.setText("0/0");
        resultTextView.setText("");
        playAgainButton.setVisibility(View.INVISIBLE);
        returnToMenu.setVisibility(View.INVISIBLE);
        resultDisplayTextView.setVisibility(View.INVISIBLE);
        countDownText.setVisibility(View.VISIBLE);
        button0.setVisibility(View.INVISIBLE);
        button1.setVisibility(View.INVISIBLE);
        button2.setVisibility(View.INVISIBLE);
        button3.setVisibility(View.INVISIBLE);
        sumTextView.setVisibility(View.INVISIBLE);

        if (MainActivity.mplayer3 != null) {
            MainActivity.mplayer3.release();
            MainActivity.mplayer3 = null;
        }

        if (MainActivity.mplayer4 != null) {
            MainActivity.mplayer4.release();
            MainActivity.mplayer4 = null;
        }

        if (MainActivity.mplayer6 != null) {
                    MainActivity.mplayer6.release();
                    MainActivity.mplayer6 = null;
        }

        MainActivity.mplayer6 = MediaPlayer.create(getApplicationContext(), R.raw.countdown);

        if (MainActivity.muted == false) {

            MainActivity.mplayer6.setVolume(0.0f, 0.0f);
        }

        MainActivity.mplayer6.start();

        countDownTimer.start();

        generateQuestion();

    }

的onCreate

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add);

        createTimer();

        // THIS CODE IS TO ENABLE THE ICON IN THE TASKBAR ////////////////////
        getSupportActionBar().setDisplayShowHomeEnabled(true);
        getSupportActionBar().setLogo(R.mipmap.ic_launcher);
        getSupportActionBar().setDisplayUseLogoEnabled(true);
        //////////////////////////////////////////////////////////////////////

        // SET IT TO ONLY POTRAIT VIEW
        setRequestedOrientation (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);

        Intent intent = getIntent();
        countDownText = (TextView) findViewById(R.id.countDownText);
        playAgainButton = (Button) findViewById(R.id.playAgainButton);
        returnToMenu = (Button) findViewById(R.id.returnToMenu);
        sumTextView = (TextView) findViewById(R.id.sumTextView);
        resultTextView = (TextView) findViewById(R.id.resultTextView);
        resultDisplayTextView = (TextView) findViewById(R.id.resultDisplayTextView);
        pointsTextView = (TextView) findViewById(R.id.pointsTextView);
        timerTextView = (TextView) findViewById(R.id.timerTextView);
        linearLayout = (LinearLayout) findViewById(R.id.linearLayout);
        linearLayout1 = (LinearLayout) findViewById(R.id.linearLayout1);
        button0 = (Button) findViewById(R.id.button0);
        button1 = (Button) findViewById(R.id.button1);
        button2 = (Button) findViewById(R.id.button2);
        button3 = (Button) findViewById(R.id.button3);
        MainActivity.mAdView = (AdView) findViewById(R.id.adView);

        MainActivity.mplayer = MediaPlayer.create(getApplicationContext(), R.raw.ticktock);
        MainActivity.mplayer1 = MediaPlayer.create(getApplicationContext(), R.raw.pop);
        MainActivity.mplayer2 = MediaPlayer.create(getApplicationContext(), R.raw.wrong);
        MainActivity.mplayer3 = MediaPlayer.create(getApplicationContext(), R.raw.fireworks);
        MainActivity.mplayer4 = MediaPlayer.create(getApplicationContext(), R.raw.poor);
        MainActivity.mplayer5 = MediaPlayer.create(getApplicationContext(), R.raw.poor);
        MainActivity.mplayer6 = MediaPlayer.create(getApplicationContext(), R.raw.countdown);
        MainActivity.mplayer7 = MediaPlayer.create(getApplicationContext(), R.raw.halfway);

        if (MainActivity.muted == false) {

            MainActivity.mplayer.setVolume(0.0f, 0.0f);
            MainActivity.mplayer1.setVolume(0.0f, 0.0f);
            MainActivity.mplayer2.setVolume(0.0f, 0.0f);
            MainActivity.mplayer3.setVolume(0.0f, 0.0f);
            MainActivity.mplayer4.setVolume(0.0f, 0.0f);
            MainActivity.mplayer5.setVolume(0.0f, 0.0f);
            MainActivity.mplayer6.setVolume(0.0f, 0.0f);
            MainActivity.mplayer7.setVolume(0.0f, 0.0f);

        }

        MainActivity.displayAds();


        mHandler.postDelayed(new Runnable() {
            public void run() {
                playAgain(playAgainButton);
            }
        }, 1000);

    }

onResume和onPause

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

        countDownTimer.start();

        if (MainActivity.mAdView != null) {
            MainActivity.mAdView.resume();
        }
    }

    @Override
    public void onPause() {

        countDownTimer.cancel();

        if (MainActivity.mAdView != null) {
            MainActivity.mAdView.pause();
        }
        super.onPause();
    }

我有全局变量设置并假设在倒计时器内的onFinnish中重置它应该重置它但不会重置它。

由于

1 个答案:

答案 0 :(得分:0)

字段(您称之为Global vars)不保证在活动娱乐时恢复,并且可以随时进行GC。您应该在创建时创建var in,将它们存储在Bundle onPouse中,然后再从另一个BundleonCreate方法中的onResume重新创建它们。

此处您有Google Dev的文档,介绍如何处理活动创建,娱乐和最终确定https://developer.android.com/training/basics/activity-lifecycle/recreating.html

基本上1)它重置为60秒,因为每次你回到你的活动时都会重新创建它(来自不同的应用程序或不同的活动) 2)idk哪里是你的“再玩”的东西,我不打算进入那个代码 3)countDownTimer.start();可能在这里它与NPE崩溃我是对的吗? (我现在正在读我的水晶球)

阅读关于活动生命周期的完整Google教程,您不会遇到任何修复代码的麻烦。

https://developer.android.com/training/basics/activity-lifecycle/index.html