本人安卓初学者,错误请指正
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>