android 定时器 Timer 使用 及其遇到的问题

来源:互联网 发布:大数据和电子政务 编辑:程序博客网 时间:2024/05/22 00:06

本人安卓初学者,错误请指正


timer = new Timer();timer.scheduleAtFixedRate(<span style="margin: 0px; padding: 0px; font-family: 'Courier New'; line-height: 18px; color: rgb(0, 0, 255);">new</span><span style="margin: 0px; padding: 0px; font-family: 'Courier New'; line-height: 18px;"> TimerTask(){  <br style="margin: 0px; padding: 0px;" /></span><span style="margin: 0px; padding: 0px; font-family: 'Courier New'; line-height: 18px; color: rgb(0, 128, 128);">2</span><span style="font-family: 'Courier New'; line-height: 18px; background-color: rgb(245, 245, 245);"> </span><span style="margin: 0px; padding: 0px; font-family: 'Courier New'; line-height: 18px;">      </span><span style="margin: 0px; padding: 0px; font-family: 'Courier New'; line-height: 18px; color: rgb(0, 0, 255);">public</span><span style="margin: 0px; padding: 0px; font-family: 'Courier New'; line-height: 18px;"> </span><span style="margin: 0px; padding: 0px; font-family: 'Courier New'; line-height: 18px; color: rgb(0, 0, 255);">void</span><span style="margin: 0px; padding: 0px; font-family: 'Courier New'; line-height: 18px;"> run() {  </span><span style="margin: 0px; padding: 0px; font-family: 'Courier New'; line-height: 18px;">  </span>
<span style="margin: 0px; padding: 0px; font-family: 'Courier New'; line-height: 18px;"><span style="white-space:pre"></span>... ...  <br style="margin: 0px; padding: 0px;" /></span><span style="margin: 0px; padding: 0px; font-family: 'Courier New'; line-height: 18px; color: rgb(0, 128, 128);">6</span><span style="font-family: 'Courier New'; line-height: 18px; background-color: rgb(245, 245, 245);"> </span><span style="margin: 0px; padding: 0px; font-family: 'Courier New'; line-height: 18px;">   <span style="white-space:pre"></span>}  <br style="margin: 0px; padding: 0px;" /></span>
</pre><pre name="code" class="java">
<span style="margin: 0px; padding: 0px; font-family: 'Courier New'; line-height: 18px; color: rgb(0, 128, 128);">7</span><span style="font-family: 'Courier New'; line-height: 18px; background-color: rgb(245, 245, 245);">   </span><span style="margin: 0px; padding: 0px; font-family: 'Courier New'; line-height: 18px;">}</span>, 0, 500);   

当我想使用定时器里在 run() 方法里面操作 ui 时发生错误,才想起来 ui 是线程非安全的
应该改为在 run() 方法里面使用  <span style="font-family: Arial, Helvetica, sans-serif;">handler.post(),或者 <span style="font-family: 'Courier New'; line-height: 18px; background-color: rgb(245, 245, 245);"> handler.sendMessage(message) </span></span>
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-family: 'Courier New'; line-height: 18px; background-color: rgb(245, 245, 245);"></span></span><pre name="code" class="java"><span style="font-family: Arial, Helvetica, sans-serif;">handler.post() 会调用 </span><span style="font-family: Arial, Helvetica, sans-serif;">getPostMessage()  把 </span><span style="font-family: Arial, Helvetica, sans-serif;">Runnable 对象封装到 message 里边  </span>

<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-family: 'Courier New'; line-height: 18px; background-color: rgb(245, 245, 245);"></span></span><pre name="code" class="java">    private static Message getPostMessage(Runnable r) {        Message m = Message.obtain();        m.callback = r;        return m;    }
这时 msg.callback != null 所以调用 msg.callback 的 run()方法。
<span style="font-family: Arial, Helvetica, sans-serif;"><span style="font-family: 'Courier New'; line-height: 18px; background-color: rgb(245, 245, 245);">这个是在主线程中执行的。。</span></span>

0 0