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文章。

微信公众号图片:














原文地址:https://www.cnblogs.com/wanghang/p/6299456.html