2012-04-26 47 views
0

实际上,我设计了一个分离的Timer类,它带有用于在textview上显示分秒的处理程序。这工作正常,因为我已经调试它和处理程序将确定句柄,但文本视图不会得到更新pl帮助我在这方面。 我正在为Timer类标记下面的代码。 在此先感谢。文本视图没有通过处理程序得到更新

public class Timer 
{ 
    private int _interval; 
    public int getInterval() 
    { 
     return _interval; 
    } 
    public void setInterval(int delay) 
    { 
     _interval = delay; 
    } 
    private Handler handler; 
    private Runnable _tickHandler; 
    private Runnable delegate; 
    private boolean ticking; 
    public boolean getIsTicking() 
    { 
     return ticking; 
    } 
    public Timer(int interval) 
    { 
     _interval = interval; 
     handler = new Handler(); 
    } 
    public Timer(int interval, Runnable onTickHandler) 
    { 
     _interval = interval; 
     setOnTickHandler(onTickHandler); 
     handler = new Handler(); 
    } 
    public void start(int interval, Runnable onTickHandler) 
    { 
     if (ticking) return; 
     _interval = interval; 
     setOnTickHandler(onTickHandler); 
     handler.postDelayed(delegate, _interval); 
     ticking = true; 
    } 
    public void start() 
    { 
     if (ticking) return; 
     handler.postDelayed(delegate, _interval); 
     ticking = true; 
    } 
    public void stop() 
    { 
     handler.removeCallbacks(delegate); 
     ticking = false; 
    } 
    public void setOnTickHandler(Runnable onTickHandler) 
    { 
     if (onTickHandler == null)  return; 
     _tickHandler = onTickHandler; 
     delegate = new Runnable() 
     { 
      public void run() 
      { 
       if (_tickHandler == null) return; 
       _tickHandler.run(); 
       handler.postDelayed(delegate, _interval); 
      } 
     } 
     ; 
    } 
} 

以下是我使用这样

runOnUIThread(new Runnable(){ 

public void run(){ 

lblDevOnOff.setText(""); 
lblDevOnOff.setText(String.format("%d:%02d", minutes,seconds)); 
} 
}) 

你应该

handlerrunOnUIThread()东西更新文本视图

Timer tmr = new Timer(100,new Runnable() 
{ 
    public void run() 
    { 
     long millis = System.currentTimeMillis() - mStartTime; 
     int seconds = (int) (millis/1000); 
     int minutes = seconds/60; 
     seconds = seconds % 60; 
     lblDevOnOff.setText(""); 
     lblDevOnOff.setText(String.format("%d:%02d", minutes,seconds)); 
    } 
} 
); 
tmr.start(); 

回答

1

把这个代码的代码这样做是因为任何与UI相关的东西都应该在UI线程上运行只有...

0

啊,这是从Android Dev Guide

因此,仅仅两个规则Android的单线程模型:

  • 不要阻塞UI线程
  • 不要从UI线程之外访问Android UI工具包