自学鸿蒙应用开发(39)- 使用多线程功能实现定时器
很多应用需要按照一定周期执行某些特定动作,本文通过一个时钟小例子介绍使用使用鸿蒙系统的多线程功能实现这一功能。以下是动作视频:
准备布局
下面的代码为了方便实现,使用TimePicker表示现在时间:
<DirectionalLayout
xmlns:ohos="http://schemas.huawei.com/res/ohos"
ohos:height="match_parent"
ohos:width="match_parent"
ohos:orientation="vertical">
<TimePicker
ohos:id="$+id:time_picker"
ohos:height="match_content"
ohos:width="match_parent"
ohos:normal_text_size="25fp"
ohos:selected_text_size="80fp"/>
</DirectionalLayout>
实现代码
以下代码是在MainAbilitySlice类中实现定时器功能的代码。第15行开始的代码使用uiTaskDispatcher生成一个延迟任务,延迟时间是50ms。
public class MainAbilitySlice extends AbilitySlice {
static final HiLogLabel LABEL_LOG = new HiLogLabel(HiLog.LOG_APP, 0x00201, "MainAbilitySlice");
long lastSecond = 0;
TimePicker timePicker = null;
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
timePicker = (TimePicker)findComponentById(ResourceTable.Id_time_picker);
onTimer();
}
void onTimer(){
final long delayTime = 50L;
TaskDispatcher uiTaskDispatcher = getUITaskDispatcher();
Revocable revocable = uiTaskDispatcher.delayDispatch(new Runnable() {
public void run() {
Calendar rightNow = Calendar.getInstance();
long currentSecond = rightNow.get(Calendar.SECOND);
if(lastSecond != currentSecond) {
timePicker.setHour(rightNow.get(Calendar.HOUR_OF_DAY));
timePicker.setMinute(rightNow.get(Calendar.MINUTE));
timePicker.setSecond(rightNow.get(Calendar.SECOND));
lastSecond = currentSecond;
}
onTimer();
}
}, delayTime);
}
}
延迟任务中的需要处理是根据现在时间设置timerPicker的小时、分、秒信息。其中有两点需要注意:
延迟任务的周期是50ms,当检测到秒值变化后更新timePicker的内容
延迟任务的最后再次调用onTimer方法,这样延迟任务会不断被触发。
作者著作介绍
《实战Python设计模式》是作者去年3月份出版的技术书籍,该书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。
对设计模式感兴趣而且希望随学随用的读者通过本书可以快速跨越从理解到运用的门槛;希望学习Python GUI 编程的读者可以将本书中的示例作为设计和开发的参考;使用Python 语言进行图像分析、数据处理工作的读者可以直接以本书中的示例为基础,迅速构建自己的系统架构。
觉得本文有帮助?请分享给更多人。
关注微信公众号【面向对象思考】轻松学习每一天!
面向对象开发,面向对象思考!
评论