今天在犯了一個愚蠢的錯誤,TimerTask中更新UI界面了,難怪半天沒反應。java
在網上搜了一篇Timer更新UI的帖子轉過來。android
錯誤寫法:web
- package com.test;
- import java.util.Timer;
- import java.util.TimerTask;
- import android.app.Activity;
- import android.os.Bundle;
- public class TestTimer_Wrong extends Activity {
- Timer timer = new Timer();
- TimerTask task = new TimerTask(){
- public void run() {
- setTitle("hear me?");
- }
- };
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- timer.schedule(task, 10000);
- }
- }
TimerTask 裏面直接作UI更新,沒有在UIThread裏面。與Java的EDT線程,是同一律念。app
正確寫法一 : 交由UI Thread處理ide
- import java.util.Timer;
- import java.util.TimerTask;
- import android.app.Activity;
- import android.os.Bundle;
- public class TestTimer extends Activity {
- Timer timer = new Timer();
- TimerTask task = new TimerTask(){
- public void run() {
-
- runOnUiThread(new Runnable(){
- @Override
- public void run() {
- setTitle("hear me?");
- }});
- }
- };
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- timer.schedule(task, 10000);
- }
- }
正確寫法二 :由Handler處理UI 更新。oop
- package com.test;
-
- import java.util.Timer;
- import java.util.TimerTask;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.Message;
-
- public class TestTimer extends Activity {
-
- Timer timer = new Timer();
- Handler handler = new Handler(){
-
- public void handleMessage(Message msg) {
- switch (msg.what) {
- case 1:
- setTitle("hear me?");
- break;
- }
- super.handleMessage(msg);
- }
-
- };
- TimerTask task = new TimerTask(){
-
- public void run() {
- Message message = new Message();
- message.what = 1;
- handler.sendMessage(message);
- }
-
- };
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- timer.schedule(task, 10000);
- }
- }