Android 超简便的倒计时实现: CountDownTimer

CountDownTimer由系统提供

查资料的时候 发现了CountDownTimer这个类之后 果断抛弃了以前的倒计时做法


功能:

30秒倒计时 每次间隔1秒


参数:

mc.start();方法开始

mc.cancel();方法结束

new MyCountDownTimer(30000, 1000); 第一个参数表示 总的时间为30000毫秒,间隔1000毫秒



直接上代码:

package com.example.daojishi;import android.app.Activity;import android.os.Bundle;import android.os.CountDownTimer;import android.util.Log;import android.view.View;import android.widget.TextView;import android.widget.Toast;/** *  * @author baozi *  * 倒计时的类  CountDownTimer *  */public class MainActivity extends Activity {private MyCountDownTimer mc;private TextView tv;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);tv = (TextView) findViewById(R.id.show);mc = new MyCountDownTimer(30000, 1000);mc.start();}public void oncancel(View view) {Toast.makeText(MainActivity.this, "取消", Toast.LENGTH_LONG).show();// toast有显示时间延迟mc.cancel();}public void restart(View view) {Toast.makeText(MainActivity.this, "重新开始", Toast.LENGTH_LONG).show();// toast有显示时间延迟mc.start();}/** * 继承 CountDownTimer 防范 *  * 重写 父类的方法 onTick() 、 onFinish() */class MyCountDownTimer extends CountDownTimer {/** *  * @param millisInFuture *            表示以毫秒为单位 倒计时的总数 *  *            例如 millisInFuture=1000 表示1秒 *  * @param countDownInterval *            表示 间隔 多少微秒 调用一次 onTick 方法 *  *            例如: countDownInterval =1000 ; 表示每1000毫秒调用一次onTick() *  */public MyCountDownTimer(long millisInFuture, long countDownInterval) {super(millisInFuture, countDownInterval);}@Overridepublic void onFinish() {tv.setText("done");}@Overridepublic void onTick(long millisUntilFinished) {Log.i("MainActivity", millisUntilFinished + "");tv.setText("倒计时(" + millisUntilFinished / 1000 + ")...");}}}//┏┓   ┏┓//┏┛┻━━━┛┻┓//┃       ┃  //┃   ━   ┃//┃ ┳┛ ┗┳ ┃//┃       ┃//┃   ┻   ┃//┃       ┃//┗━┓   ┏━┛//┃   ┃   神兽保佑        //┃   ┃   代码无BUG!//┃   ┗━━━┓//┃       ┣┓//┃       ┏┛//┗┓┓┏━┳┓┏┛//  ┃┫┫ ┃┫┫//  ┗┻┛ ┗┻┛

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context=".MainActivity" >    <TextView        android:id="@+id/show"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="@string/hello_world" />    <Button        android:id="@+id/button1"        android:onClick="oncancel"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignLeft="@+id/show"        android:layout_below="@+id/show"        android:layout_marginLeft="50dp"        android:layout_marginTop="106dp"        android:text="cancel" />    <Button        android:id="@+id/button2"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_alignLeft="@+id/button1"        android:layout_below="@+id/button1"        android:layout_marginTop="63dp"        android:onClick="restart"        android:text="restart" /></RelativeLayout>


附:

CountDownTimer源码:

/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package android.os;import android.util.Log;/** * Schedule a countdown until a time in the future, with * regular notifications on intervals along the way. * * Example of showing a 30 second countdown in a text field: * * <pre class="prettyprint"> * new CountDownTimer(30000, 1000) { * *     public void onTick(long millisUntilFinished) { *         mTextField.setText("seconds remaining: " + millisUntilFinished / 1000); *     } * *     public void onFinish() { *         mTextField.setText("done!"); *     } *  }.start(); * </pre> * * The calls to {@link #onTick(long)} are synchronized to this object so that * one call to {@link #onTick(long)} won't ever occur before the previous * callback is complete.  This is only relevant when the implementation of * {@link #onTick(long)} takes an amount of time to execute that is significant * compared to the countdown interval. */public abstract class CountDownTimer {    /**     * Millis since epoch when alarm should stop.     */    private final long mMillisInFuture;    /**     * The interval in millis that the user receives callbacks     */    private final long mCountdownInterval;    private long mStopTimeInFuture;    /**     * @param millisInFuture The number of millis in the future from the call     *   to {@link #start()} until the countdown is done and {@link #onFinish()}     *   is called.     * @param countDownInterval The interval along the way to receive     *   {@link #onTick(long)} callbacks.     */    public CountDownTimer(long millisInFuture, long countDownInterval) {        mMillisInFuture = millisInFuture;        mCountdownInterval = countDownInterval;    }    /**     * Cancel the countdown.     */    public final void cancel() {        mHandler.removeMessages(MSG);    }    /**     * Start the countdown.     */    public synchronized final CountDownTimer start() {        if (mMillisInFuture <= 0) {            onFinish();            return this;        }        mStopTimeInFuture = SystemClock.elapsedRealtime() + mMillisInFuture;        mHandler.sendMessage(mHandler.obtainMessage(MSG));        return this;    }    /**     * Callback fired on regular interval.     * @param millisUntilFinished The amount of time until finished.     */    public abstract void onTick(long millisUntilFinished);    /**     * Callback fired when the time is up.     */    public abstract void onFinish();    private static final int MSG = 1;    // handles counting down    private Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {            synchronized (CountDownTimer.this) {                final long millisLeft = mStopTimeInFuture - SystemClock.elapsedRealtime();                if (millisLeft <= 0) {                    onFinish();                } else if (millisLeft < mCountdownInterval) {                    // no tick, just delay until done                    sendMessageDelayed(obtainMessage(MSG), millisLeft);                } else {                    long lastTickStart = SystemClock.elapsedRealtime();                    onTick(millisLeft);                    // take into account user's onTick taking time to execute                    long delay = lastTickStart + mCountdownInterval - SystemClock.elapsedRealtime();                    // special case: user's onTick took more than interval to                    // complete, skip to next interval                    while (delay < 0) delay += mCountdownInterval;                    sendMessageDelayed(obtainMessage(MSG), delay);                }            }        }    };}

每日精进 前进一步


更多相关文章

  1. Android 中自定义控件和属性(attr.xml,declare-styleable,TypedA
  2. Android - 常见错误的解决方法
  3. Android入门教程 AsyncTask的使用及execute和executeOnExecutor
  4. 关于Html中jsp调用Android中方法无效的一点建议
  5. Android NullPointerException解决方法(空指针异常)
  6. Android刷Root方法,zergRush,Odin3+CWM(ClockworkMod recovery)
  7. [Android]实现静默安装APK的两种方法
  8. Android中ScrollView隐藏进度条方法
  9. Android百度地图一种简单实现多标注及响应时间的方法

随机推荐

  1. android之调用webservice 实现图片上传下
  2. 如何上传应用软件到 Android(安卓)Market
  3. Android之网络丢包事件
  4. Android开发艺术探索——第十章:Android的
  5. Android面试系列文章2018之Android部分之
  6. 在Android中创建和使用数据库
  7. android扫描二维码(zxing)附带小例子
  8. Android防止内存溢出浅析
  9. Android(安卓)P 图形显示系统(九) Android
  10. android之调用webservice 实现图片上传