timer.scheduleAtFixedRate有一个例外

时间:2014-07-01 16:17:09

标签: java android timer

我的代码是:

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):threadid = 11:线程退出未捕获异常(组= 0x40a13300)
  07-01 15:27:30.786:E / AndroidRuntime(973):致命异常:Timer-0
  07-01 15:27:30.786:E / AndroidRuntime(973):java.lang.RuntimeException:无法在未调用Looper.prepare()的线程内创建处理程序   07-01 15:27:30.786:E / AndroidRuntime(973):在android.os.Handler。(Handler.java:121)
  07-01 15:27:30.786:E / AndroidRuntime(973):在android.widget.Toast $ TN。(Toast.java:322)
  07-01 15:27:30.786:E / AndroidRuntime(973):在android.widget.Toast。(Toast.java:91)
  07-01 15:27:30.786:E / AndroidRuntime(973):在android.widget.Toast.makeText(Toast.java:238)
  07-01 15:27:30.786:E / AndroidRuntime(973):在ir.maghsoodi.reminders.MainActivity $ 1 $ 1.run(MainActivity.java:45)
  07-01 15:27:30.786:E / AndroidRuntime(973):at java.util.Timer $ TimerImpl.run(Timer.java:284)

2 个答案:

答案 0 :(得分: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");
   }
 });
}

答案 1 :(得分:1)

您无法从其他线程更新UI,您需要按照here的说明使用处理程序,或者(在我看来更容易)使用eventbus