2016-09-02 2 views
0

다음 코드를 사용하여 다음과 같은 결과가있는 diffirent 위치에서 실행 해 보았습니다. 1) on에 배치하면 60 초로 재설정됩니다. 2) 배치시 재생이 버튼을 다시 누를 때까지 onResume에서 그런 다음 마지막 onPause 위치에서 카운트 다운이 시작 완벽하게 작동하는 것 같다 playAgain 방법에 배치하는 경우 3)는CountDownTimer의 전역 변수가 변경되지 않습니다

코드 충돌 : 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 방법

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

I 글로벌 VAR 세트를 가지고 카운트 다운 타이머 내에서 onFinnish에 재설정하는 것은 그것을 그러나 그것을 재설정해야한다고 가정 하지 않습니다.

감사

+0

어떤 예외가 발생합니까? – Antoniossss

+0

null 포인터입니다. 이유는 createTimer() 전에 countDownTimer.start()를 호출했기 때문입니다. 나는 그것이 어디 있는지 생각하기 위해 놀고있다. createTimer()가 onResume에 있으면 all이 작동하지만 다시 재생할 때 timeRemaining = l 값을 유지합니다. –

답변

0

필드는 (당신이 글로벌 바르라는 것) 활동 휴양에 복원하고, GC 언제가 될 수 guranteed 아니다. create에서 var를 생성하고 BundleonPouse에 저장하고 Bundle에서 다른 onCreate 또는 onResume 메소드로 다시 생성해야합니다. 여기

당신은 활동 생성, 레크리에이션 및 마무리 https://developer.android.com/training/basics/activity-lifecycle/recreating.html

그래서 basicly 1)는 당신이 diffrerent 응용 프로그램 AOR에서 (사용자의 작업에 돌아갈 때마다 다시 생성되기 때문에 60 초에 재설정을 처리하는 방법에 대한 구글 데브의 문서를 가지고 다른 활동) 2) idk 당신의 "놀이 다시"일이 어디서 그 코드에 들어 가지 않을거야 3) countDownTimer.start(); 아마 여기 NPE와 충돌 맞지? (지금 내 결정체 공을 읽고 있습니다)

활력주기와 관련된 Google의 전체 자습서를 읽고 코드를 수정하는 데 문제가 없습니다.

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

관련 문제