Search code examples
androidtimestack-overflowchronometer

Android Chronotmeter onChronometerTick stackoverflowerror?


I am writting a code in Android to develop a Chronometer app. But i am facing some of the error while i am trying to reset the Chronometer on certain time.

MyCode:

mChronometer.setBase(SystemClock.elapsedRealtime() - 86396000);


     mChronometer.start();


             mChronometer.setOnChronometerTickListener(new Chronometer.OnChronometerTickListener()
             {

                 @Override
                 public void onChronometerTick(Chronometer chronometer) 
                 {


                    long myElapsedMillis = SystemClock.elapsedRealtime() - chronometer.getBase();

                     if(myElapsedMillis>=86400000)
                     {

                         chronometer.stop();                                                        

                         chronometer.setBase(0);

                         chronometer.start();


                     }

                 }


              } );

Error:

08-18 02:30:16.793: E/AndroidRuntime(23075): FATAL EXCEPTION: main
08-18 02:30:16.793: E/AndroidRuntime(23075): java.lang.StackOverflowError
08-18 02:30:16.793: E/AndroidRuntime(23075):    at   android.graphics.Paint.getTextRunAdvances(Paint.java:1845)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.graphics.Paint.getTextRunAdvances(Paint.java:1818)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.text.TextLine.handleText(TextLine.java:755)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.text.TextLine.handleRun(TextLine.java:907)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.text.TextLine.measureRun(TextLine.java:414)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.text.TextLine.measure(TextLine.java:293)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.text.TextLine.metrics(TextLine.java:267)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.text.BoringLayout.isBoring(BoringLayout.java:308)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.TextView.makeSingleLayout(TextView.java:6025)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.TextView.makeNewLayout(TextView.java:5917)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.TextView.checkForRelayout(TextView.java:6501)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.TextView.setText(TextView.java:3729)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.TextView.setText(TextView.java:3587)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.TextView.setText(TextView.java:3562)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.updateText(Chronometer.java:250)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.updateRunning(Chronometer.java:257)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.start(Chronometer.java:188)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at com.example.androidchronometer.MainActivity$1.onChronometerTick(MainActivity.java:46)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.dispatchChronometerTick(Chronometer.java:279)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.updateRunning(Chronometer.java:258)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.start(Chronometer.java:188)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at com.example.androidchronometer.MainActivity$1.onChronometerTick(MainActivity.java:46)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.dispatchChronometerTick(Chronometer.java:279)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.updateRunning(Chronometer.java:258)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.start(Chronometer.java:188)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at com.example.androidchronometer.MainActivity$1.onChronometerTick(MainActivity.java:46)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.dispatchChronometerTick(Chronometer.java:279)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.updateRunning(Chronometer.java:258)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.start(Chronometer.java:188)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at com.example.androidchronometer.MainActivity$1.onChronometerTick(MainActivity.java:46)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.dispatchChronometerTick(Chronometer.java:279)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.updateRunning(Chronometer.java:258)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.start(Chronometer.java:188)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at com.example.androidchronometer.MainActivity$1.onChronometerTick(MainActivity.java:46)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.dispatchChronometerTick(Chronometer.java:279)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.updateRunning(Chronometer.java:258)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.start(Chronometer.java:188)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at com.example.androidchronometer.MainActivity$1.onChronometerTick(MainActivity.java:46)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.dispatchChronometerTick(Chronometer.java:279)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.updateRunning(Chronometer.java:258)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.start(Chronometer.java:188)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at com.example.androidchronometer.MainActivity$1.onChronometerTick(MainActivity.java:46)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.dispatchChronometerTick(Chronometer.java:279)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.updateRunning(Chronometer.java:258)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.start(Chronometer.java:188)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at com.example.androidchronometer.MainActivity$1.onChronometerTick(MainActivity.java:46)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.dispatchChronometerTick(Chronometer.java:279)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.updateRunning(Chronometer.java:258)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.start(Chronometer.java:188)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at com.example.androidchronometer.MainActivity$1.onChronometerTick(MainActivity.java:46)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.dispatchChronometerTick(Chronometer.java:279)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.updateRunning(Chronometer.java:258)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.start(Chronometer.java:188)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at com.example.androidchronometer.MainActivity$1.onChronometerTick(MainActivity.java:46)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.dispatchChronometerTick(Chronometer.java:279)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.updateRunning(Chronometer.java:258)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at android.widget.Chronometer.start(Chronometer.java:188)
08-18 02:30:16.793: E/AndroidRuntime(23075):    at com.example.androidchronometer.MainActivity$1.onChronometerTick

I am facing the StackOverFlowError , while i am trying reset the chronometer on certain time.

Please let me know , how can i get rid of this error , please suggest me what could be the possible solution for this problem.


Solution

  • Set the base to SystemClock.elapsedRealtime() instead of 0:

        public void onChronometerTick(Chronometer chronometer) 
        {
                // ...
                chronometer.setBase(SystemClock.elapsedRealtime());
                chronometer.start();
                // ...
        }