Android简易实战教程--第五十一话《使用Handler实现增加、减少、暂停计数》
转载博客请注明出处:道龙的博客
之前,写过一篇使用异步任务AysncTask实现倒计时的小案例,喜欢的话可以参考博客:Android简易实战教程--第三十三话《 AsyncTask异步倒计时》。
本篇在此基础上,使用Handler实现一些顺序计数以及倒叙计数。本篇小案例基本涵盖Handler使用场景还值得推敲哒~
喜欢的朋友可以关注本专栏,专栏会持续更新下去,而且文章会越来越标准化。案例简单,轻松阅读。
博客只会给出核心代码和解析,全部代码可自行下载。
本篇源代码下载GitHub地址,开启代码传送门---------->>>https://github.com/codeydl/MyApplication
先看一下需求分析,我们最后实现什么样的功能:
1. 初始时
显示10,可以通过点击按钮改变其值,即“手动增加1”
2. 点击“自动增加”
每隔1S上面的文本数值增加1,但最大显示20并作出提示
3. 点击“自动减少”
每隔1S上面的文本数值减少1,但最小显示1并作出提示
4. 点击“暂停”
上面的数值文本不再变化
接下来就跟着文章一步步的实现
一、初始时显示10,可以通过点击按钮改变其值,即“手动增加”
我们获取到布局文件中的所有实例后。按钮实现点击事件,重写onClick()方法:
@Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_demo_increase: mHandler.sendEmptyMessage(MES_WHAT_INCREASE); break; case R.id.btn_demo_decrease: mHandler.sendEmptyMessage(MES_WHAT_DECREASE); break; case R.id.btn_demo_pause: break; default: break; } }增加按钮和减少按钮,都发一条空消息,携带waht字段以区分是哪个位置发送的消息。此时Handler的HandlerMesage回调方法被调用,在此做数据的而改变,UI的更新:
private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case MES_WHAT_INCREASE: number ++; tvdemonumber.setText(number+""); break; case MES_WHAT_DECREASE: number --; tvdemonumber.setText(number+""); break; default: break; } } };实现效果如下图所示:
二、点击一次“自动增加”,每隔1S上面的文本数值增加1,但最大显示20并作出提示;点击“自动减少”每隔1S上面的文本数值减少1,但最小显示1并作出提示;点击“暂停”,上面的数值文本不再变化
使用Handler发送延时1s的消息,为了实现每隔一秒就发送一条消息,在接收消息的地方在发送一条消息给自己。这样就巧妙的实现了1秒钟刷新一次UI了。代码如下:
或者倒计时的时候:case MES_WHAT_INCREASE: ...... tvdemonumber.setText(number+""); //实现循环发送消息。执行完UI刷新后,再一次调用sendEmptyMessageDelayed方法,隔1s发送一条消息给自己。从而实现了隔1s值增加1 mHandler.sendEmptyMessageDelayed(MES_WHAT_INCREASE,1000); break;
这个时候运行程序:case MES_WHAT_DECREASE: ...... //发消息给自己,原理同上边 mHandler.sendEmptyMessageDelayed(MES_WHAT_DECREASE,1000); break;
开始可以实现自动增加,但是再点击减少的时候,发现卡住了。原因在于,我们在多个位置处发送了消息,增加的按钮和减少的按钮,都放松了消息。而且点击增加,若再点击减少,消息会不断的重复进入handlMessage方法中。一处要UI更新是增加另一UI更新是减少。这样就好像是卡住了。因此在点击增加要消息清理掉减少按钮发送的消息,点击减少按钮同样清理掉增加按钮的消息。
case R.id.btn_demo_increase: //清理掉减少扫按钮发送的消息 mHandler.removeMessages(MES_WHAT_DECREASE); //发消息(增加) mHandler.sendEmptyMessage(MES_WHAT_INCREASE); break; case R.id.btn_demo_decrease: //清理掉增加按钮发送的消息 mHandler.removeMessages(MES_WHAT_INCREASE); //发消息(减少) mHandler.sendEmptyMessage(MES_WHAT_DECREASE); break;判断上限20,下限1:
在处理消息的地方,在1或者20的地方,做出判断,并移除消息。
if(number == 20){ //移除消息 mHandler.removeMessages(MES_WHAT_INCREASE); Toast.makeText(getApplicationContext(),"已经最大值",Toast.LENGTH_SHORT).show(); return; }或者:
if(number == 1){ //停止移除消息 mHandler.removeMessages(MES_WHAT_DECREASE); Toast.makeText(getApplicationContext(),"已经最小值",Toast.LENGTH_SHORT).show(); return; }以及加入暂停效果:
三、加入按钮可操作性:
最后,也是比较关键的地方发。我们点击增加,就要屏蔽增加按钮效果;点击减少,屏蔽减少效果;到上限或者下限按钮又可用,但是暂停按钮不可用;
比如在点击了增加按钮后,可以这么写:使得增加按钮为不可用,不要再次点击
//限制Button可操作性 btndemoincrease.setEnabled(false); btndemodecrease.setEnabled(true); btndemopause.setEnabled(true);
再比如,上限时候,设置:使得暂停按钮和自动增加按钮设置不可用,表示已经到上限了不需要暂停也不需要增加。
if(number == 20){ //限制Button可操作性 btndemoincrease.setEnabled(false); btndemodecrease.setEnabled(true); btndemopause.setEnabled(false); .......................... }
最后运行效果如下:
喜欢的话可以关注我博客,有问题大家一起交流。也可以动手微信扫描下方二维码查看更多安卓文章:
打开微信搜索公众号 Android程序员开发指南 或者手机扫描下方二维码 在公众号阅读更多Android文章。
微信公众号图片: