Android中一些计时类讲解案例

在Android开发中,我们往往会用到一些计时的类,像Timer,CountDownTimer等等

下面本人想讲解关于CountDownTimer类:

从字面可以看出,该类是记录下载时间。将后台线程的创建和Handler队列封装成一个方便的类调用。

看了一下文档,其实这个类很简单,只有四个方法,其中都涉及到了onTick,OnFinsh

cancel,start,前两个是抽象方法,需要重写

例子:

  1. new CountdownTimer(30001000) {  
  2.     public void onTick(long millisUntilFinished) {  
  3.         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);  
  4.     }  
  5.     public void onFinish() {  
  6.         mTextField.setText("done!");  
  7.     }  
  8.  }.start();  

一个简单的小demo

  1. package cn.dm;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.content.Intent;  
  6. import android.os.CountDownTimer;  
  7. import android.widget.TextView;  
  8. import android.widget.Toast;  
  9. public class NewActivity extends Activity {  
  10.     private MyCount mc;  
  11.     private TextView tv;  
  12.     @Override  
  13.     protected void onCreate(Bundle savedInstanceState) {  
  14.         // TODO Auto-generated method stub  
  15.         super.onCreate(savedInstanceState);  
  16.         setContentView(R.layout.main);  
  17.         tv = (TextView)findViewById(R.id.show);  
  18.         mc = new MyCount(300001000);  
  19.         mc.start();  
  20.     }//end func  
  21.   
  22.     /*定义一个倒计时的内部类*/  
  23.     class MyCount extends CountDownTimer {     
  24.         public MyCount(long millisInFuture, long countDownInterval) {     
  25.             super(millisInFuture, countDownInterval);     
  26.         }     
  27.         @Override     
  28.         public void onFinish() {     
  29.             tv.setText("finish");        
  30.         }     
  31.         @Override     
  32.         public void onTick(long millisUntilFinished) {     
  33.             tv.setText("请等待30秒(" + millisUntilFinished / 1000 + ")...");     
  34.             Toast.makeText(NewActivity.this, millisUntilFinished / 1000 + "", Toast.LENGTH_LONG).show();//toast有显示时间延迟       
  35.         }    
  36.     }     
  37. }  
主要是重写onTick和onFinsh这两个方法,onFinish()中的代码是计时器结束的时候要做的事情;onTick(Long m)中的代码是你倒计时开始时要做的事情,参数m是直到完成的时间,构造方法MyCount()中的两个参数中,前者是倒计的时间数,后者是倒计每秒中间的间隔时间,都是以毫秒为单位。例如要倒计时30秒,每秒中间间隔时间是1秒,两个参数可以这样写MyCount(3000,1000)。 将后台线程的创建和Handler队列封装成为了一个方便的类调用。

当你想取消的时候使用mc.cancel()方法就行了。


(2)Timer

main.xml


[html] <?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
 
    <Button 
        android:id="@+id/button" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="开始倒计时" /> 
 
    <TextView 
        android:id="@+id/textView" 
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" /> 
 
</LinearLayout> 
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="开始倒计时" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content" />

</LinearLayout>
TimerDemoActivity.java


[java] package com.tianjf; 
 
import java.util.Timer; 
import java.util.TimerTask; 
 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.os.Message; 
import android.util.Log; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
import android.widget.TextView; 
 
public class TimerDemoActivity extends Activity implements OnClickListener { 
 
    private Button button; 
    private TextView textView; 
    private Timer timer; 
 
    // 定义Handler  
    Handler handler = new Handler() { 
 
        @Override 
        public void handleMessage(Message msg) { 
            super.handleMessage(msg); 
 
            Log.d("debug", "handleMessage方法所在的线程:" 
                    + Thread.currentThread().getName()); 
 
            // Handler处理消息  
            if (msg.what > 0) { 
                textView.setText(msg.what + ""); 
            } else { 
                textView.setText("点火!"); 
                // 结束Timer计时器  
                timer.cancel(); 
            } 
        } 
    }; 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
 
        button = (Button) findViewById(R.id.button); 
        textView = (TextView) findViewById(R.id.textView); 
 
        Log.d("debug", "onCreate方法所在的线程:" 
                + Thread.currentThread().getName()); 
        button.setOnClickListener(this); 
    } 
 
    @Override 
    public void onClick(View v) { 
        switch (v.getId()) { 
        case R.id.button: 
            // 按钮按下时创建一个Timer定时器  
            timer = new Timer(); 
            // 创建一个TimerTask  
            // TimerTask是个抽象类,实现了Runnable接口,所以TimerTask就是一个子线程  
            TimerTask timerTask = new TimerTask() { 
                // 倒数10秒  
                int i = 10; 
 
                @Override 
                public void run() { 
                    Log.d("debug", "run方法所在的线程:" 
                            + Thread.currentThread().getName()); 
                    // 定义一个消息传过去  
                    Message msg = new Message(); 
                    msg.what = i--; 
                    handler.sendMessage(msg); 
                } 
            }; 
            // 定义计划任务,根据参数的不同可以完成以下种类的工作:  
            // 1.schedule(TimerTask task, Date when) ー> 在固定时间执行某任务  
            // 2.schedule(TimerTask task, Date when, long period) ー> 在固定时间开始重复执行某任务,重复时间间隔可控  
            // 3.schedule(TimerTask task, long delay) ー> 在延迟多久后执行某任务  
            // 4.schedule(TimerTask task, long delay, long period) ー> 在延迟多久后重复执行某任务,重复时间间隔可控  
            timer.schedule(timerTask, 3000, 1000);// 3秒后开始倒计时,倒计时间隔为1秒  
            break; 
 
        default: 
            break; 
        } 
    } 
} 

1

Android考虑到线程安全问题,不允许在线程中执行UI线程,在Android中,有一个很有意思的类:android.os.Handler,这个可以实现各处线程间的消息传递。先看段代码,这个实例化了一个Handler,Handler可以通过Message在多个线程通讯,我这里做的是定时recLen加1,然后以一定的格式,显示到recTime上(UI线程上的操作)。

  
  
  
  
  1. final Handler handler = new Handler(){    
  2.     public void handleMessage(Message msg) {    
  3.         switch (msg.what) {        
  4.            case 1:        
  5.                 recLen++;  
  6.        recTime.setText(GetRecTime(recLen));  
  7.                break;        
  8.             }        
  9.             super.handleMessage(msg);    
  10.         }      
  11.    };   

下面定实例化一个TimerTask,这个是为Timer提供一个定时执行的内容。我在这个方法中加的是给Handler一个发送消息功能,因这在Timer的线程中,无法直接操作UI线程。

  
  
  
  
  1. TimerTask task = new TimerTask(){    
  2.       public void run() {    
  3.        Message message = new Message();        
  4.       message.what = 1;        
  5.        handler.sendMessage(message);      
  6.   }    
  7. };   

剩下的工作就简单多,添加一个Timer,可以让程序运行起来了

  
  
  
  
  1. timer = new Timer(true);  
  2. timer.schedule(task,1000, 1000); //延时1000ms后执行,1000ms执行一次  
  3. //timer.cancel(); //退出计时器 

说到这里,也许有些还感觉云里雾里,笔者好久没写东西,也不知道怎么把问题说的更明白,这个再贴上笔者开始的错误写法,对比错误写法,也许能让大家更快的明白过来。

  
  
  
  
  1. TimerTask task = new TimerTask(){    
  2.     public void run() {    
  3.         recLen++;  
  4.         recTime.setText(GetRecTime(recLen));//直接在TimerTask中操作UI线程,单步调试的时候发现,程序根本就没执行到这里  
  5.     }    
  6. };    
  7. timer = new Timer(true);  
  8. timer.schedule(task,1000, 1000);   

参考文章

http://blog.csdn.net/aomandeshangxiao/article/details/6597866


你可能感兴趣的:(android,timer)