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文章。

    微信公众号图片:






































  • 相关阅读:
    python 替换图片中的像素
    python paddleocr 增加识别速度的方法
    mysql 子查询少用
    mysql 临时表代替in的方法
    mysql创建临时表不用创建临时表结构的方法
    Nginx 报错 connect() failed (110: Connection timed out) while connecting to upstream
    用mkcert生成SSL,内网完美起跑https
    用于制作任何echarts地图(省、市、区、城镇街道)
    javascript执行机制
    ES6便捷语法
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299471.html
Copyright © 2011-2022 走看看