android 定时器更新UI

很快就到了22:30.作为程序员,现在这个时间,好像是吃完饭刚开始吧。唠叨结束。 
目的:
使用定时器每秒更新一下 TextView ,来显示一下上面的内容。
艰辛使用之路开始了。
注意:在我的使用探索过程中我得知,定时器任务的run 方法是开启另一个子线程。但在子线程中又不能直接更新UI。
Handler 就解决了这个问题。
制作过程:
1、声明所使用的类

import java.util.Timer;       (定时器)
import java.util.TimerTask;   (定时器任务)
import android.os.Handler;    (Handler 更新UI)
import android.os.Message;    (Handler 向UI 发送信息)
2、定义定时器
Timer timer = new Timer();    可以放到O你Create() 函数中,也可以放到类内。
3、定义定时器任务
TimerTask timertask = new TimerTask() {
    @Override
    public void run() {   (这个run 的使用就是开启了一个新的线程,在这个子线程中是无法更新UI 的,比如更新TextView 的显示内容。)
        Message message = new Message();        (message 定义,是为了给Handler 向Ui 发送信息作为媒介。)
          message.what = i;
        handler.sendMessage(message);(Handler 发送message。这里发送回去调用handler 类中的回掉函数:handlerMessage())
    }
};
4、定义Handler 对象,并实现回调函数
@SuppressLint("HandlerLeak")
private  Handler handler = new Handler(){
    public void handleMessage(Message message){
        switch (message.what){      (what 是message 中的变量,可以尽情的使用)
            case 0:
                tv.setText("123");  (在这里面就可以调用TextView 控件了。)
                break;
            case 1:
                tv.setText("456");
                break;
        }
    }
};

5、在定时器任务中已经调用了handler 对象,并使用了。现在开始绑定定时器及定时器任务。

timer.schedule(timertask,1000,1000); (这个语句放到了OnCreate() 函数中,也就是开机就开始跑定时器了。)
 
6、定时器还可以取消,但是我现在还没有使用。
timer.cancel();   (具体这个函数会被放到什么地方,就看你想在什么地方取消掉了。)
 
问题:
1、我多次试图在定时器任务的 run()  方法中执行设置TextView UI 的显示内容,但是程序刚开始执行就出现了程序一场崩溃。
解决办法就是:子线程中不能更新UI,需要使用Handler和Message 来更新UI界面。

祝大家好运!!

猜你喜欢

转载自blog.csdn.net/luzire/article/details/81543014