之前本专栏文章中的小案例有写到:第三十九话《Chronometer实现倒计时》

以及使用异步实现倒计时:第三十三话《 AsyncTask异步倒计时》

本篇文章

结合Timer、TimerTask和Handler来实现相同的功能。

下面介绍一下Handler及其主要用法:

在android中提供了一种异步回调机制Handler,利用它我们可以在完成任务后做出相应的通知。

handler基本使用:

在主线程中,使用handler很简单,new一个Handler对象然后实现其handleMessage方法,在handleMessage中提供收到消息后相应的处理方法即可。

发送消息的经典代码如下:

Message message = new Message();
message.what = 1;
handler.sendMessage(message);

调用Handler的sendMessage方法发送一个Message对象,并设置其what属性值为1,用于标志位。

接收消息的经典代码如下:

final Handler handler = new Handler(){
   @Override
   public void handleMessage(Message msg){
       switch (msg.what) {
           case 1:
                  //逻辑处理
              break;
               }
       }
   }
};

创建一个Handler对象并覆写了其handleMessage方法,根据msg.what属性值判断是哪儿发送的消息。

Handler+Timer+TimerTask实现倒计时:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent"
   android:layout_height="match_parent">    <Button
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:background="@android:color/transparent"
       android:onClick="begin"
       android:text="倒计时开始" />    <TextView
       android:id="@+id/txttime"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_centerInParent="true"
       android:text="倒计时开始"
       android:textColor="@android:color/holo_green_light"
       android:textSize="32sp" />
</RelativeLayout>

MainActivity.java:

public class MainActivity extends Activity {
   private int secondLeft = 10;
   private TextView txtView;
   Timer timer = new Timer();
   public void onCreate(Bundle savedInstanceState){
       super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
       txtView = (TextView)findViewById(R.id.txttime);
   }
   public void begin(View view){
       timer.schedule(task, 1000, 1000);       // timeTask
   }
   final Handler handler = new Handler(){
       @Override
       public void handleMessage(Message msg){
           switch (msg.what) {
               case 1:
                   txtView.setText(""+ secondLeft);
                   if(secondLeft < 0){
                       timer.cancel();
                       txtView.setText("倒计时结束");
                   }
           }
       }
   };
   TimerTask task = new TimerTask() {
       @Override
       public void run() {
           secondLeft--;
           Message message = new Message();
           message.what = 1;
           handler.sendMessage(message);
       }
   };
}

timer.schedule(new MyTask(),long time1,long timer2);

下面我就重点介绍一下该方法:

第一个参数,是 TimerTask 类,在包:import Java.util.TimerTask .使用者要继承该类,并实现public void run() 方法,因为 TimerTask 类 实现了 Runnable 接口。

第二个参数的意思是,当你调用该方法后,该方法必然会调用 TimerTask 类 TimerTask 类 中的 run()方法,这个参数就是这两者之间的差值,转换成汉语的意思就是说,用户调用 schedule() 方法后,要等待这么长的时间才可以第一次执行run() 方法。

第三个参数的意思就是,第一次调用之后,从第二次开始每隔多长的时间调用一次 run() 方法。

schedule(TimerTask task, long delay)的注释:Schedules thespecified task for execution after the specifieddelay。大意是在延时delay毫秒后执行task。并没有提到重复执行

schedule(TimerTask task, long delay, long period)的注释:Schedulesthe specified task for repeated fixed-delay execution, beginningafter the specified delay。大意是在延时delay毫秒后重复的执行task,周期是period毫秒。

这样问题就很明确schedule(TimerTask task, longdelay)只执行一次,schedule(TimerTask task, long delay, longperiod)才是重复的执行。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------

然后:TimerTask的run方法中,每次对剩余时间减一,然后实例化一个Message类,并设置其what属性为1,最后调用Handler的sendMessage方法发送这个Message对象。

在Handler的handleMessage方法中,首先判断若接收的msg的what属性为1,则进行相关逻辑处理,同时若secondLeft值小于1时,则调用Timer的cancel方法取消计时,并设置textview的text值为“倒计时结束”。

运行实例如下:

喜欢我的朋友可以关注我的博客专栏。

也可以打开微信搜索公众号  Android程序员开发指南  或者手机扫描下方二维码 在公众号阅读更多Android文章。

微信公众号图片:

Android简易实战教程--第四十八话《Android - Timer、TimerTask和Handler实现倒计时》的更多相关文章

  1. Android简易实战教程--第四十六话《RecyclerView竖向和横向滚动》

    Android5.X后,引入了RecyclerView,这个控件使用起来非常的方便,不但可以完成listView的效果,而且还可以实现ListView无法实现的效果.当然,在新能方便也做了大大的提高. ...

  2. Android简易实战教程--第四十九话《满屏拖动的控件》

    今天做个有意思的效果吧,控件的拖拽,简单实用,逻辑清晰点3分钟看完. 说的很高大上,其实就是拖动Button按钮跟着鼠标位置满手机屏幕跑罢了. 直接上简单的代码吧: public class Main ...

  3. Android简易实战教程--第四十五话《几种对话框》

    Android中提供了各种原生的对话框,在使用简单的功能的时候,还不比考虑自定义,使用原生的也能完成功能.本篇简单小案例就介绍三种对话框. 还是直接上代码吧: 布局中三个点击事件的按钮: <Li ...

  4. Android简易实战教程--第三十八话《自定义通知NotifiCation》

    上一篇小案例,完成了一个普通的通知,点击通知启动了一个活动.但是那里的通知没有加入些"靓点",这一篇就给它加入自定义的布局,完成自定义的通知. 应用:比如QQ音乐为例,当点击音乐播 ...

  5. Android简易实战教程--第四十二话《Spinner下拉级联效果》

    本篇承接第四十话第四十话<Spinner> 参考博客:http://blog.csdn.net/yayun0516 进入正题: Strings加入第一级数据: <string-arr ...

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

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

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

    对于Spinner控件的介绍和使用方法,可以先看之前写过的一篇博客:Spinner控件详解 本篇就基于这个知识点完成一个简单的小案例: 根据介绍,先写一个布局: <?xml version=&q ...

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

    今天完成一个简单的电话录音功能,即接通电话后,立即录下自己打电话的声音.实现起来比较简单:一个服务,一个TelephonyManager.一个MediaRecorder就够了. 1.布局提供一个开启录 ...

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

    已经好几天不更新博客了,今天轻松一点模拟个简单的"音乐播放器".1分钟看完~ 整个简单布局,加几个控制按钮: <LinearLayout xmlns:android=&quo ...

随机推荐

  1. Spting +Spring MVC+spring date jsp +hibernate+jq

    controller 控制页面跳转 处理前台后台数据交互 访问servicedao层:@Repository 数据库访问层 增删改查 jpa规范了hibernate jap仓库 jpa自动解析 方法名 ...

  2. Zookeeper增删改查

    1.下载Zookeeper http://mirrors.shu.edu.cn/apache/zookeeper/ 这里我选择Zookeeper 3.4.11版本 ZooKeeper 支持某些特定的四 ...

  3. mysql sql语句执行时是否使用索引检查方法

    在日常开发中,使用到的数据表经常都会有索引,这些索引可能是开发人员/DBA建表时创建的,也可能是在使用过程中新增的.合理的使用索引,可以加快数据库查询速度.然而,在实际开发工作中,会出现有些sql语句 ...

  4. [LeetCode] Couples Holding Hands 两两握手

    N couples sit in 2N seats arranged in a row and want to hold hands. We want to know the minimum numb ...

  5. ios开发-将false和true,当做字典的值,并将字典转成字符串,上传到服务器

    今天遇到一个需求,将false和true,当做字典的值,并将字典转成字符串,上传到服务器. 可能这个需求大家遇到过,大部分原因是安卓的同事已经按这样的需求开发完了.我们只能跟随安卓的脚步了. (一)处 ...

  6. JS点击按钮打开新的独立页面

    工作中遇到需要点击按钮弹出一个独立的页面,并显示指定内容的问题,查了一些资料后,得到以下方法: window.open('locationPage.html', '_blank', 'height=1 ...

  7. [SDOI 2014]数表

    Description 有一张N×m的数表,其第i行第j列(1 < =i < =N,1 < =j < =m)的数值为 能同时整除i和j的所有自然数之和.给定a,计算数表中不大于 ...

  8. Topcoder口胡记 SRM 562 Div 1 ~ SRM 599 Div 1

    据说做TC题有助于提高知识水平? :) 传送门:https://284914869.github.io/AEoj/index.html 转载请注明链接:http://www.cnblogs.com/B ...

  9. ●POJ 3378 Crazy Thairs

    题链: http://poj.org/problem?id=3378 题解: 树状数组维护,高精度. 依次考虑以每个位置结尾可以造成的贡献. 假设当前位置为i,为了达到5个元素的要求,我们需要求出,在 ...

  10. 【Uva 11280 飞到弗雷德里顿】

    ·你可以尽情地坐飞机,但停留次数遭到限制. ·英文题,述大意:       给出一张有向图,起点是输入的第一个城市,终点是输入的最后一个城市.给出q个询问,每个询问含一个t,表示 #include&l ...