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文章。
微信公众号图片:
Android简易实战教程--第五十一话《使用Handler实现增加、减少、暂停计数》的更多相关文章
- Android简易实战教程--第五十话《动画扫描》
祝新年快乐!2017(一起)前行. 转载博客请注明出处:道龙的博客 本篇简答的小案例,使用动画知识,完成一个类似雷达扫描效果,并且加入自定义进度条.对于自定义进度条前面有很详细的解析和案例了,本篇就结 ...
- Android简易实战教程--第三十一话《自定义土司》
最近有点忙,好几天不更新博客了.今天就简单点,完成自定义土司. 主布局文件代码: <RelativeLayout xmlns:android="http://schemas.andro ...
- Android简易实战教程--第四十八话《Android - Timer、TimerTask和Handler实现倒计时》
之前本专栏文章中的小案例有写到:第三十九话<Chronometer实现倒计时> 以及使用异步实现倒计时:第三十三话< AsyncTask异步倒计时> 本篇文章 结合Timer. ...
- Android简易实战教程--第三十五话《音乐播放》
已经好几天不更新博客了,今天轻松一点模拟个简单的"音乐播放器".1分钟看完~ 整个简单布局,加几个控制按钮: <LinearLayout xmlns:android=&quo ...
- Android简易实战教程--第四十五话《几种对话框》
Android中提供了各种原生的对话框,在使用简单的功能的时候,还不比考虑自定义,使用原生的也能完成功能.本篇简单小案例就介绍三种对话框. 还是直接上代码吧: 布局中三个点击事件的按钮: <Li ...
- Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》
Android5.X后,引入了RecyclerView,这个控件使用起来非常的方便,不但可以完成listView的效果,而且还可以实现ListView无法实现的效果.当然,在新能方便也做了大大的提高. ...
- Android简易实战教程--第四十二话《Spinner下拉级联效果》
本篇承接第四十话第四十话<Spinner> 参考博客:http://blog.csdn.net/yayun0516 进入正题: Strings加入第一级数据: <string-arr ...
- Android简易实战教程--第三十六话《电话录音》
今天完成一个简单的电话录音功能,即接通电话后,立即录下自己打电话的声音.实现起来比较简单:一个服务,一个TelephonyManager.一个MediaRecorder就够了. 1.布局提供一个开启录 ...
- Android简易实战教程--第三十二话《使用Lrucache和NetworkImageView加载图片》
转载本专栏每一篇博客请注明转载出处地址,尊重原创.此博客转载链接地址:小杨的博客 http://blog.csdn.net/qq_32059827/article/details/5279131 ...
随机推荐
- requests-get请求
import requests response= requests.get('http://www.baidu.com')#get方法请求网址 print(response) print(respo ...
- terraform基本使用
安装terraform 下载terraform最新版本: wget https://releases.hashicorp.com/terraform/0.11.5/terraform_0.11.5_l ...
- JQuery开发报错集锦
报错一:JQuery $.each遍历JSON字符串报Uncaught TypeError:Cannot use 'in' operator to search for "70". ...
- 关于web XSS注入问题
对web安全方面的知识非常薄弱,这篇文章把Xss跨站攻击和sql注入的相关知识整理了下,附带公司写的一个filer. 对于防止sql注入发生,我只用过简单拼接字符串的注入及参数化查询,可以说没什么好经 ...
- C++ 类模板与模板类详解
在C++的Template中很多地方都用到了typename与class这两个关键字,有时候这两者可以替换,那么这两个关键字是否完全一样呢? 事实上class用于定义类,在模板引入c++后,最初定义模 ...
- 数十种TensorFlow实现案例汇集:代码+笔记(转)
转:https://www.jiqizhixin.com/articles/30dc6dd9-39cd-406b-9f9e-041f5cbf1d14 这是使用 TensorFlow 实现流行的机器学习 ...
- C#之Winform跨线程访问控件
C#中禁止跨线程直接访问控件,InvokeRequired是为了解决这个问题而产生的,当一个控件的InvokeRequired属性值为真时,说明有一个创建它以外的线程想访问它.此时它将会在内部调用ne ...
- 在Unity3D中利用 RenderTexture 实现游戏内截图
using System.Collections; using System.Collections.Generic; using System.IO; using UnityEngine; publ ...
- HTML5 AJAX跨域请求
HTML5新的标准中,增加了" Cross-Origin Resource Sharing"特性,这个特性的出现使得跨域通信只需通过配置http协议头来即可解决. Cross-Or ...
- [HNOI 2010]chorus 合唱队
Description 题库链接 对于一个包含 \(N\) 个整数的数列 \(A\) ,我们可以把它的所有元素加入一个双头队列 \(B\) . 首先 \(A_1\) 作为队列的唯一元素,然后依次加入 ...