这里写自定义目录标题
- 前言
- 效果图
- Handler 实现倒计时
- Timer + handler 实现倒计时
- HandlerThread+runOnUiThread方式
- 几种方式的优缺点
- 设定内容居中、居左、居右
- SmartyPants
- 导出与导入
- 导出
- 导入
前言
在日常的开发过程中经常会需要用到倒计时或者延时。前段时间的有一个延迟自动关闭dialog的需求,进度条需要等待一会才会到达100%,当时我直接
···
Thread.sleep(3000);
dismiss();
···
,这样子并没有达到我要的等待的效果,而且还可能造成主线程阻塞,真是无知啊。这篇博客也写一下倒计时和延时常用的方式吧,作为一个学习笔记。本篇博客写了三种倒计时的方式。
效果图
Handler 实现倒计时
handlerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bootNextTime = 11;
UIHandler.sendEmptyMessage(1);
}
});
···
private int bootNextTime = 11;
private Timer timer;
private Handler UIHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
Log.d(TAG, "msg.what=" + msg.what);
switch (msg.what) {
case 1:
bootNextTime--;
mTextView.setText("正在设置倒计时关机,请在 " + bootNextTime + "s 内不要断开电源 !!!");
if (bootNextTime > 0) {
sendEmptyMessageDelayed(1, 1000);
} else {
mTextView.setText("倒计时关机已设置完成!");
}
break;
首先我们用UIHandler.sendEmptyMessage(1);
去启动UIHandler,然后在handleMessage方法里面每隔一秒给自己发一次sendEmptyMessageDelayed(1, 1000);
一直到倒计时时10秒。
Timer + handler 实现倒计时
mTimerButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
bootNextTime = 11;
bootNextTime--;
TimerTask timerTask = new TimerTask() {
@Override
public void run() {
UIHandler.sendEmptyMessage(2);
}
};
timer = new Timer();
timer.schedule(timerTask, 0, 1000);
}
});
···
case 2:
bootNextTime--;
mTextView.setText("正在设置倒计时关机,请在 " + bootNextTime + "s 内不要断开电源 !!!");
if (bootNextTime == 0) {
mTextView.setText("倒计时关机已设置完成!");
timer.cancel();
}
break;
timer.schedule(timerTask, 0, 1000);
每隔一秒会执行一次,我们在UIHandler中根据bootNextTime的值来判断倒计时的此时,并且要注意timer.cancel();
取消timer。
HandlerThread+runOnUiThread方式
如果没有耗时操作是不需要用到子线程的,这面还是列出来。
首先定义HandlerThread
private HandlerThread handlerThread;
然后onCreate中初始化HandlerThread 和 workhandler
handlerThread = new HandlerThread(“倒计时”);
handlerThread.start();
initHandler();
initHandler() 的 方法如下,将handlerThread 的looper传给这个handler 用于处理耗时操作,当然这里其实没有耗时操作,子线程更新UI 可以用UIHandler.post
和runOnUiThread
private void initHandler() {
//子线程
workHandler = new Handler(handlerThread.getLooper()) {
@Override
public void handleMessage(final Message msg) {
switch (msg.what) {
case 1:
//
bootNextTime--;
UIHandler.post(new Runnable() {
@Override
public void run() {
mTextView.setText("正在设置倒计时关机,请在 " + bootNextTime + "s 内不要断开电源 !!!");
}
});
if (bootNextTime > 0) {
removeMessages(1);
sendEmptyMessageDelayed(1, 1000);
}else {
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextView.setText("倒计时关机已设置完成!");
}
});
}
break;
}
}
};
}
几种方式的优缺点
一个简单的表格是这么创建的:
项目 | Value |
电脑 | $1600 |
手机 | $12 |
导管 | $1 |
设定内容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
第一列文本居中 | 第二列文本居右 | 第三列文本居左 |
SmartyPants
SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:
TYPE | ASCII | HTML |
Single backticks |
| ‘Isn’t this fun?’ |
Quotes |
| “Isn’t this fun?” |
Dashes |
| – is en-dash, — is em-dash |
导出与导入
导出
如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。
导入
如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。