关闭

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

507人阅读 评论(0) 收藏 举报
分类:

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

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

微信公众号图片:














1
0
查看评论

Android通过子线程和handler实现倒计时,可以开始暂停倒计时

package tech.androidstudio.handlerdemotimer; import android.os.Handler; import android.os.Message; import android.support.v7.app.AppCompatActivity; i...
  • Rodulf
  • Rodulf
  • 2016-03-19 14:46
  • 3469

Handler暂停接收Message的实现

Handler暂停接收Message的实现
  • qq_30496695
  • qq_30496695
  • 2017-06-10 14:39
  • 396

Android实战简易教程<十六>(LineChart实现数据趋势展示)

aChartEngine中的line Chart是线图,是数据显示的一种。首先我们要下载aChartEngine的jar包,然后导入到工程中。 直接看一下代码(部分注释): [java] view plaincopy pa...
  • scholar_man
  • scholar_man
  • 2015-09-25 11:07
  • 1162

Android实战简易教程-第二十三枪(基于Baas的用户注册和登录模块实现!)

接着上两篇文章,我们基于Bmob提供的API实现用户登录功能,整体看一下代码。1.注册页面xml:<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:too...
  • yayun0516
  • yayun0516
  • 2015-07-23 07:47
  • 1840

Android 实现简易下载管理器 (暂停、断点续传、多线程下载)

什么都先别说,先看预览图!预览图中是限制了同时最大下载数为 2 的.其实下载管理器的实现是挺简单的,我们需要弄清楚几点就行了 1.所有任务的Bean应该存在哪里,用什么存? 2.如何判断任务是否已存在? 3.如何判断任务是新的任务或是从等待中恢复的任务? 4.应该如何把下载列表...
  • ocwvar
  • ocwvar
  • 2016-04-20 13:36
  • 4031

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

今天完成一个简单的电话录音功能,即接通电话后,立即录下自己打电话的声音。实现起来比较简单:一个服务,一个TelephonyManager、一个MediaRecorder就够了。 1、布局提供一个开启录音服务的按钮。 2、服务里面代码如下:(代码详细解释都在里面了) package com.itydl...
  • qq_32059827
  • qq_32059827
  • 2016-10-26 08:27
  • 481

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

已经好几天不更新博客了,今天就轻松一点模拟个简单的“音乐播放器”。
  • qq_32059827
  • qq_32059827
  • 2016-10-24 23:02
  • 822

Android简易实战教程--第四十话《Spinner》

对于Spinner控件的介绍和使用方法,可以先看之前写过的一篇博客:Spinner控件详解 本篇就基于这个知识点完成一个简单的小案例: 根据介绍,先写一个布局: <LinearLayout xmlns:android="http://schemas.android.com...
  • qq_32059827
  • qq_32059827
  • 2016-11-09 22:31
  • 672

Android简易实战教程--第三十七话《NotifiCation》

通知的使用,无疑是Android系统的亮点之一;就连IOS在5.0开始也引入了类似通知的技巧。可见它的实用性。 今天这个小案例,就学习一下通知的基本使用,API是使用最新的API,4.3以前创建通知的API已经过时。 首先定义个布局: <LinearLayout xmlns:androi...
  • qq_32059827
  • qq_32059827
  • 2016-10-28 19:45
  • 629

android 停止Handler

mHandler.removeCallbacks(mRunnable); 或者 handler.removeMessages(what);
  • imdxt1986
  • imdxt1986
  • 2011-11-17 14:48
  • 17697
    个人资料
    • 访问:477305次
    • 积分:9124
    • 等级:
    • 排名:第2432名
    • 原创:401篇
    • 转载:39篇
    • 译文:11篇
    • 评论:113条
    博客专栏