转载博客请注明出处:道龙的博客

之前,写过一篇使用异步任务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文章。

微信公众号图片:

Android简易实战教程--第五十一话《使用Handler实现增加、减少、暂停计数》的更多相关文章

  1. Android简易实战教程--第五十话《动画扫描》

    祝新年快乐!2017(一起)前行. 转载博客请注明出处:道龙的博客 本篇简答的小案例,使用动画知识,完成一个类似雷达扫描效果,并且加入自定义进度条.对于自定义进度条前面有很详细的解析和案例了,本篇就结 ...

  2. Android简易实战教程--第三十一话《自定义土司》

    最近有点忙,好几天不更新博客了.今天就简单点,完成自定义土司. 主布局文件代码: <RelativeLayout xmlns:android="http://schemas.andro ...

  3. Android简易实战教程--第四十八话《Android - Timer、TimerTask和Handler实现倒计时》

    之前本专栏文章中的小案例有写到:第三十九话<Chronometer实现倒计时> 以及使用异步实现倒计时:第三十三话< AsyncTask异步倒计时> 本篇文章 结合Timer. ...

  4. Android简易实战教程--第三十五话《音乐播放》

    已经好几天不更新博客了,今天轻松一点模拟个简单的"音乐播放器".1分钟看完~ 整个简单布局,加几个控制按钮: <LinearLayout xmlns:android=&quo ...

  5. Android简易实战教程--第四十五话《几种对话框》

    Android中提供了各种原生的对话框,在使用简单的功能的时候,还不比考虑自定义,使用原生的也能完成功能.本篇简单小案例就介绍三种对话框. 还是直接上代码吧: 布局中三个点击事件的按钮: <Li ...

  6. Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》

    Android5.X后,引入了RecyclerView,这个控件使用起来非常的方便,不但可以完成listView的效果,而且还可以实现ListView无法实现的效果.当然,在新能方便也做了大大的提高. ...

  7. Android简易实战教程--第四十二话《Spinner下拉级联效果》

    本篇承接第四十话第四十话<Spinner> 参考博客:http://blog.csdn.net/yayun0516 进入正题: Strings加入第一级数据: <string-arr ...

  8. Android简易实战教程--第三十六话《电话录音》

    今天完成一个简单的电话录音功能,即接通电话后,立即录下自己打电话的声音.实现起来比较简单:一个服务,一个TelephonyManager.一个MediaRecorder就够了. 1.布局提供一个开启录 ...

  9. Android简易实战教程--第三十二话《使用Lrucache和NetworkImageView加载图片》

    转载本专栏每一篇博客请注明转载出处地址,尊重原创.此博客转载链接地址:小杨的博客    http://blog.csdn.net/qq_32059827/article/details/5279131 ...

随机推荐

  1. 第一章 搭建一个通用的.net core项目框架

    项目目标部署环境:CentOS 7+ 项目技术点:.netcore2.0 + Autofac +webAPI + NHibernate5.1 + mysql5.6 + nginx 开源地址:https ...

  2. [LeetCode] Encode and Decode TinyURL 编码和解码精简URL地址

    Note: This is a companion problem to the System Design problem: Design TinyURL. TinyURL is a URL sho ...

  3. hadoop一键安装伪分布式

    hadoop伪分布式和hive在openSUSE中的安装 在git上的路径为:https://github.com/huabingood/hadoop--------/tree/master 各个文件 ...

  4. CSS滚动条样式定制

    效果图如下 <!DOCTYPE html> <!-- saved from url=(0061)http://www.xuanfengge.com/demo/201311/scrol ...

  5. Java集合详解一

    在学习集合之前,我们需要思考的是为什么要有集合?集合有什么用? 我们知道,在java中有数组的概念,数组可以用来存放一组数据.但是,数组是固定长度的,这样在使用的时候就会有很多的不方便,比如说资源的浪 ...

  6. [SHOI2016]黑暗前的幻想乡

    Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖 怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类) 博丽灵梦和八云紫等人整日高谈所有妖怪 ...

  7. 亲戚(relative)

    [题目背景] Y 家是世界上最大的家族,HJZ 是其中一员. 现在 Y 家人想要拍一张全家福,却发现这是一个十分复杂的问题. . . . . . [题目描述] Y 家一共有 n 人 其中每个人最多有一 ...

  8. ●CodeForces 429D Trick_Function

    题链: http://codeforces.com/problemset/problem/429/D题解: 分治,最近点对 不难发现g(i,j)=sum[j]-sum[i], 那么f(i,j)=(i- ...

  9. 【BZOJ3531】【SDOI2014】旅行

    题目传送门 题目大意:给定一棵无根树,每个节点有自己的类别和权值,现在给定两个类别相同的点,叫你求这2点路径上同类别节点的权值和/最大权值. 节点类别与权值会改变. 解题思路:考虑对每一个类别开一棵线 ...

  10. hdu 3954 线段树 (标记)

    Level up Time Limit: 10000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...