An error occurred while transitioning to the method after some delay time

I am developing a quiz based application, and in this m trying to switch to some method after some delay time, but unfortunately I am getting some runtime error. Here is the code ..

new Timer().schedule(new TimerTask() { @Override public void run() { resetcolor(); nextpage(); rg.clearCheck(); showdata(); } }, 6000); 

And here is my log error ...

 09-12 12:11:06.775: W/dalvikvm(489): threadid=7: thread exiting with uncaught exception (group=0x4001d800) 09-12 12:11:06.789: E/AndroidRuntime(489): FATAL EXCEPTION: Timer-0 09-12 12:11:06.789: E/AndroidRuntime(489): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views. 09-12 12:11:06.789: E/AndroidRuntime(489): at android.view.ViewRoot.checkThread(ViewRoot.java:2802) 09-12 12:11:06.789: E/AndroidRuntime(489): at android.view.ViewRoot.invalidateChild(ViewRoot.java:607) 09-12 12:11:06.789: E/AndroidRuntime(489): at android.view.ViewRoot.invalidateChildInParent(ViewRoot.java:633) 09-12 12:11:06.789: E/AndroidRuntime(489): at android.view.ViewGroup.invalidateChild(ViewGroup.java:2505) 09-12 12:11:06.789: E/AndroidRuntime(489): at android.view.View.invalidate(View.java:5115) 09-12 12:11:06.789: E/AndroidRuntime(489): at android.widget.TextView.invalidateDrawable(TextView.java:3796) 09-12 12:11:06.789: E/AndroidRuntime(489): at android.graphics.drawable.Drawable.invalidateSelf(Drawable.java:300) 09-12 12:11:06.789: E/AndroidRuntime(489): at android.graphics.drawable.DrawableContainer.selectDrawable(DrawableContainer.java:227) 09-12 12:11:06.789: E/AndroidRuntime(489): at android.graphics.drawable.StateListDrawable.onStateChange(StateListDrawable.java:97) 09-12 12:11:06.789: E/AndroidRuntime(489): at android.graphics.drawable.Drawable.setState(Drawable.java:400) 09-12 12:11:06.789: E/AndroidRuntime(489): at android.widget.CompoundButton.drawableStateChanged(CompoundButton.java:271) 09-12 12:11:06.789: E/AndroidRuntime(489): at android.view.View.refreshDrawableState(View.java:7248) 09-12 12:11:06.789: E/AndroidRuntime(489): at android.widget.CompoundButton.setChecked(CompoundButton.java:115) 09-12 12:11:06.789: E/AndroidRuntime(489): at android.widget.RadioGroup.setCheckedStateForView(RadioGroup.java:179) 09-12 12:11:06.789: E/AndroidRuntime(489): at android.widget.RadioGroup.check(RadioGroup.java:159) 09-12 12:11:06.789: E/AndroidRuntime(489): at android.widget.RadioGroup.clearCheck(RadioGroup.java:205) 09-12 12:11:06.789: E/AndroidRuntime(489): at com.example.quizapp.Firstques$1$1.run(Firstques.java:234) 09-12 12:11:06.789: E/AndroidRuntime(489): at java.util.Timer$TimerImpl.run(Timer.java:289) 
+1
source share
2 answers

Rewrite the code as follows:

 new Thread(new Runnable() { @Override public void run() { try { Thread.sleep(6000); runOnUiThread(new Runnable() { @Override public void run() { resetcolor(); nextpage(); rg.clearCheck(); showdata(); } }); } catch (InterruptedException e) { Thread.currentThread().interrupt(); } } }).start(); 

Your problem is that you cannot touch user interface elements from the background thread. The above code performs user interface changes in the main thread (also known as the "user interface thread").

+1
source

TimerTask is running in a different thread. Ui should update or access the ui thread. So use runOnUiThread

Inside the timertask start method

 new Timer().schedule(new TimerTask() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { resetcolor(); nextpage(); rg.clearCheck(); showdata(); } }); } }, 6000); 

Or use a handler

 Handler m_handler; Runnable m_handlerTask ; handler= new Handler() m_handlerTask = new Runnable() { @Override public void run() { // do something resetcolor(); nextpage(); rg.clearCheck(); showdata() m_handler.postDelayed(m_handlerTask, 6000); } }; m_handlerTask.run(); 

To stop the m_handler.removeCallbacks(m_handlerTask) handler

+1
source

Source: https://habr.com/ru/post/1501794/


All Articles