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

原创 2017年01月03日 20:38:38

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

之前,写过一篇使用异步任务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简单运用(控制进度条)

Handler消息传递机制在android中至关重要,Android应用开发中,我们需要用线程周期性的改变控件的属性值,而此则需要Handler的消息机制去实现。 Handler类的主要作用与用法:...

Handler暂停接收Message的实现

Handler暂停接收Message的实现

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Android简易实战教程--第三十九话《Chronometer实现倒计时》

Android提供了实现按照秒计时的API,今天就是用这个API实现简单的倒计时。 来个布局: ...

Android简易实战教程--第十九话《手把手教您监听EditText文本变化,实现抖动和震动的效果》

监听文本输入情况,仅仅限于土司略显low一点,这一篇就稍微“高大上”一点,体验一下滚动和震动。 首先,需要两个文件。截图: 两个文件的内容分别如下: cycle_7: s...

Android简易实战教程--第三话《自己实现打电话》

需要一个文本输入框输入号码,需要一个按钮打电话。本质:点击按钮,调用系统打电话功能。 xml布局文件代码:: ...

Android简易实战教程--第四十七话《使用OKhttp回调方式获取网络信息》

在之前的小案例中写过一篇使用HttpUrlConnection获取网络数据的例子。在OKhttp盛行的时代,当然要学会怎么使用它,本篇就对其基本使用做一个介绍,然后再使用它的接口回调的方式获取相同的数...

Android简易实战教程--第四十四话《ScrollView和HorizontalScrollView简单使用》

一、ScrollView 由于手机屏幕的高度有限,当普通布局放不下现实和的内容时,ScrollView视图(滚动视图)就会派上用场,因为数据可以往下滚动显示。 二、HorizontalScrollV...

Android实战简易教程<四十四>(Ripple Effect-为控件增加涟漪效果)

最近发现了一款可以为控件增加涟漪效果的github项目,可以提升应用的逼格啊,大家不妨引入到自己的项目中。该项目本身是android studio下面编译,我改成了eclipse下可以运行的项目,下面...

Android实战简易教程-第二十八枪(基于Bmob实现头像图片设置和网络上传功能!)

上一篇我们介绍了如何由uri转换成String ,本文就用到了上篇文章的方法,下面我们介绍一下如何设置头像后将头像图片上传到云端的方法,本文基于Bmob提供的服务。看一下代码:(布局文件和前两篇文章依...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android简易实战教程--第五十一话《使用Handler实现增加、减少、暂停计数》
举报原因:
原因补充:

(最多只允许输入30个字)