很快就到了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界面。
祝大家好运!!