zoukankan      html  css  js  c++  java
  • 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文章。

    微信公众号图片:














  • 相关阅读:
    学习python报错处理
    Java命名规则
    python打开文件可以有多种模式
    python中的异常
    python中的构造函数和构造函数和析构函数的作用
    学习网址
    使用Python+selenium过程中所需安装的库和软件
    oracle 、server和my sql 语法区别
    blob(斑点)特征,SimpleBlobDetector(OpenCV案例源码detect_blob.cpp解读)
    查找与绘制轮廓findContours()、drawContours()(OpenCV案例源码contours2.cpp解读)
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299456.html
Copyright © 2011-2022 走看看