TimerTask 更新UI线程

今天在犯了一个愚蠢的错误,TimerTask中更新UI界面了,难怪半天没反应。java

 

在网上搜了一篇Timer更新UI的帖子转过来。android

 

错误写法:web

[java]   view plain copy
<EMBED id=ZeroClipboardMovie_1 name=ZeroClipboardMovie_1 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=1&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. package com.test;  
  2. import java.util.Timer;  
  3. import java.util.TimerTask;  
  4. import android.app.Activity;  
  5. import android.os.Bundle;  
  6. public class TestTimer_Wrong extends Activity {  
  7.     Timer timer = new Timer();  
  8.     TimerTask task = new TimerTask(){  
  9.         public void run() {  
  10.                        setTitle("hear me?");  
  11.         }  
  12.     };  
  13.     public void onCreate(Bundle savedInstanceState) {  
  14.         super.onCreate(savedInstanceState);  
  15.         setContentView(R.layout.main);  
  16.         timer.schedule(task, 10000);  
  17.     }  
  18. }  

 

TimerTask 里面直接作UI更新,没有在UIThread里面。与Java的EDT线程,是同一律念。app

正确写法一 : 交由UI Thread处理ide

 

[java]   view plain copy
<EMBED id=ZeroClipboardMovie_2 name=ZeroClipboardMovie_2 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=2&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. import java.util.Timer;  
  2. import java.util.TimerTask;  
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. public class TestTimer extends Activity {  
  6.     Timer timer = new Timer();  
  7.     TimerTask task = new TimerTask(){  
  8.         public void run() {  
  9.               
  10.             runOnUiThread(new Runnable(){  
  11.             @Override  
  12.             public void run() {  
  13.                 setTitle("hear me?");  
  14.             }});  
  15.             }  
  16.     };  
  17.     public void onCreate(Bundle savedInstanceState) {  
  18.         super.onCreate(savedInstanceState);  
  19.         setContentView(R.layout.main);  
  20.         timer.schedule(task, 10000);  
  21.     }  
  22. }  

 

正确写法二 :由Handler处理UI 更新。oop

[java]   view plain copy
<EMBED id=ZeroClipboardMovie_3 name=ZeroClipboardMovie_3 type=application/x-shockwave-flash align=middle pluginspage=http://www.macromedia.com/go/getflashplayer height=18 width=18 src=http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf wmode="transparent" flashvars="id=3&width=18&height=18" allowfullscreen="false" allowscriptaccess="always" bgcolor="#ffffff" quality="best" menu="false" loop="false">
  1. package com.test;     
  2.     
  3. import java.util.Timer;     
  4. import java.util.TimerTask;     
  5.     
  6. import android.app.Activity;     
  7. import android.os.Bundle;     
  8. import android.os.Handler;     
  9. import android.os.Message;     
  10.     
  11. public class TestTimer extends Activity {     
  12.     
  13.     Timer timer = new Timer();     
  14.     Handler handler = new Handler(){     
  15.     
  16.         public void handleMessage(Message msg) {     
  17.             switch (msg.what) {         
  18.             case 1:         
  19.                 setTitle("hear me?");     
  20.                 break;         
  21.             }         
  22.             super.handleMessage(msg);     
  23.         }     
  24.              
  25.     };     
  26.     TimerTask task = new TimerTask(){     
  27.     
  28.         public void run() {     
  29.             Message message = new Message();         
  30.             message.what = 1;         
  31.             handler.sendMessage(message);       
  32.         }     
  33.              
  34.     };     
  35.     public void onCreate(Bundle savedInstanceState) {     
  36.         super.onCreate(savedInstanceState);     
  37.         setContentView(R.layout.main);     
  38.         timer.schedule(task, 10000);     
  39.     }     
  40. }