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

之前本专栏文章中的小案例有写到:第三十九话《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文章。

微信公众号图片:






































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