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

    微信公众号图片:






































  • 相关阅读:
    LightOJ 1132 Summing up Powers(矩阵快速幂)
    hdu 3804 Query on a tree (树链剖分+线段树)
    LightOJ 1052 String Growth && uva 12045 Fun with Strings (矩阵快速幂)
    uva 12304 2D Geometry 110 in 1! (Geometry)
    LA 3263 That Nice Euler Circuit (2D Geometry)
    2013 SCAUCPC Summary
    poj 3321 Apple Tree (Binary Index Tree)
    uva 11796 Dog Distance (几何+模拟)
    uva 11178 Morley's Theorem (2D Geometry)
    动手动脑
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299471.html
Copyright © 2011-2022 走看看