提问者:小点点

timer. schduleAtFixedrate有异常


我的代码是:

ou=100
final Timer t=new Timer();
TimerTask tt=new TimerTask() {              
       @Override
       public void run() {
           ou-=10;
           if(ou==0)
               btnstart.setText(btnstart.getText().toString()+"t");

      }};
t.scheduleAtFixedRate(tt, 2000, 2000);

但是当我运行这个程序的时候,更改btnstart. text程序会关闭这个错误“不幸的是,已经停止了”

这是我的原木猫:

07-01 15:27:30.714:W/dalvikvm(973):triadid=11:线程退出且未捕获异常(group=0x40a13300)
07-01 15:27:30.786:E/AndroidRuntime(973):FATAL EXCEPTION:Timer-0
07-01 15:27:30.786:E/AndroidRuntime(973):java.lang.RuntimeException:无法在未调用Loopo的线程内创建处理程序。准备()
07-01 15:27:30.786:E/AndroidRuntime(973):at android.os.Handler。(Handler.java:121)
07-01 15:27:30.786:E/AndroidRuntime(973):at android.widget.Toast$TN。(Toast.java:322)
07-01 15:27:30.786:E/AndroidRuntime(973):at androidMainActivity1美元1.run(MainActivity.java:45)
07-01 15:27:30.786:E/AndroidRuntime(973):at java.util.Timer$TimerImpl.run(Timer.java:284)


共2个答案

匿名用户

TimerTask在另一个线程(TimerThread)中执行,您不能从非主线程更新UI元素。

使用btnstart.post(Runnable)执行线程中UI代码。

例子

if(ou==0) {
 btnstart.post(new Runnable() {
   @Override
   public void run() {
     btnstart.setText(btnstart.getText().toString()+"t");
   }
 });
}

匿名用户

你不能从另一个线程更新UI,你需要使用这里解释的处理程序,或者(在我看来更容易)使用eventbus库