很多应用需要按照一定周期执行某些特定动作,本文通过一个时钟小例子介绍使用使用鸿蒙系统的多线程功能实现这一功能。以下是动作视频:
准备布局
下面的代码为了方便实现,使用TimePicker表示现在时间:
<?xml version="1.0" encoding="utf-8"?>
<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;
@Override
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() {
@Override
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的小时、分、秒信息。其中有两点需要注意:
作者著作介绍
《实战Python设计模式》是作者去年3月份出版的技术书籍,该书利用Python 的标准GUI 工具包tkinter,通过可执行的示例对23 个设计模式逐个进行说明。这样一方面可以使读者了解真实的软件开发工作中每个设计模式的运用场景和想要解决的问题;另一方面通过对这些问题的解决过程进行说明,让读者明白在编写代码时如何判断使用设计模式的利弊,并合理运用设计模式。