1. 程式人生 > >Java/Android倒計時(開始,暫停,恢復,停止)

Java/Android倒計時(開始,暫停,恢復,停止)

由於要做暫停和恢復,這裡我就沒有使用Android的CountDownTimer,而是用了Java的Timer。所以,這個方法在java肯定是通用。我也外加了Android獨有的Service,有些計時器需要在Activiy關閉的情況下依然在計時,回到Activity時,顯示當前的計時狀態。

Timer 這個Java的類,具體看Java的API說明,但是要注意一點:

Timer 在cancel後,需要重新new 一次。

首先要給計時器定義三個狀態:準備,開始,暫停。

    public static final int PREPARE = 0;
    public static final int START = 1;
    public static final int PASUSE = 2;

1.準備:沒有開始計時,最初始狀態;

2.開始:已經開始倒計時

3.暫停:已經開始倒計時,而且使用者點選了暫停

開始、恢復倒計時,我定義了這個方法:

    /**
     * start count down
     */
    private void startTimer(){
        timer = new Timer();
        timerTask = new MyTimerTask();
        timer.scheduleAtFixedRate(timerTask, 0, timer_unit);
    }

timer_unit 就是執行timer 任務的時間,我定義為1秒。MyTimerTask是我定義的一個倒計時計算方法,如下:

    /**
     * count down task
     */
    private class MyTimerTask extends TimerTask{

        @Override
        public void run() {
            timer_couting -=timer_unit;
            if(timer_couting==0){
                cancel();
                initTimerStatus();
            }
            mHandler.sendEmptyMessage(1);
        }
    }
timer_couting 是一個變數,記錄當前倒計時還剩餘多少時間,當剩餘時間為0時,倒計時結束,所以cancel結束倒計時。每次倒計一秒通過handler傳送到主執行緒來更新ui提示倒計時資訊。

在介面上定義兩個按鈕,一個開始,一個停止,開始後可以暫停,暫停後可以恢復。

          case R.id.btn_start:
                switch (timerStatus){
                    case CountDownTimerUtil.PREPARE:
                        startTimer();
                        timerStatus = CountDownTimerUtil.START;
                        btnStart.setText("PAUSE");
                        break;
                    case CountDownTimerUtil.START:
                        timer.cancel();
                        timerStatus = CountDownTimerUtil.PASUSE;
                        btnStart.setText("RESUME");
                        break;
                    case CountDownTimerUtil.PASUSE:
                        startTimer();
                        timerStatus = CountDownTimerUtil.START;
                        btnStart.setText("PAUSE");
                        break;
                }
                break;
            case R.id.btn_stop:
                if(timer!=null){
                    timer.cancel();
                    initTimerStatus();
                    mHandler.sendEmptyMessage(1);
                }

對於Android應用中需要用到關閉了Activity後依然在計時,在這裡我們需要用Service,定義Service的情況跟上面類同,但是要注意的是這個計時Service是要單例模式,保證每次倒計時進來都是同一個倒計時。還需要定義一些方法來讓Activity給這個Service傳遞操作命令,開始,暫停,恢復,停止。
    /**
     * start
     */
    public void startCountDown(){
        startTimer();
        timerStatus = CountDownTimerUtil.START;
    }

    /**
     * paust
     */
    public void pauseCountDown(){
        timer.cancel();
        timerStatus = CountDownTimerUtil.PASUSE;
    }

    /**
     * stop
     */
    public void stopCountDown(){
        if(timer!=null){
            timer.cancel();
            initTimerStatus();
            mCountDownTimerListener.onChange();
        }
    }
在Activity裡面獲取這個Service
countDownTimerService = CountDownTimerService.getInstance(new MyCountDownLisener()
                ,service_distination_total);

專案原始碼:https://github.com/arjinmc/Android-CountDownTimer

相關推薦

Java/Android倒計時開始暫停恢復停止

由於要做暫停和恢復,這裡我就沒有使用Android的CountDownTimer,而是用了Java的Timer。所以,這個方法在java肯定是通用。我也外加了Android獨有的Service,有些計時器需要在Activiy關閉的情況下依然在計時,回到Activity時,顯

JAVA多執行緒機制之暫停恢復停止

在JDK1.2以前的版本如果要實現執行緒的暫停、恢復和停止的方法分別是suspend()、resume()、stop()。但是從JDK1.2以後這些方法已經被遺棄,因為它們有可能造成嚴重的系統錯誤和異常。 首先suspend()方法不會釋放執行緒所佔用的資源。

Appium+java+android搭建appium環境Android環境java環境

Appium+java+android自動化測試 環境搭建 一.JDK下載安裝及環境變數配置 進入下面的連結找到與你的電腦系統相對應得jdk版本,點選下載 jdk下載地址 安裝JDK 選擇安裝目錄 安裝過程中會出現兩次 安裝提示 。第一次是安裝 jdk ,第二次是安

java android 讀寫西門子PLC數據包含S7協議和Fetch/Write協議s7支持200smart300PLC1200PLC1500PLC

操作 [1] sim mmu 時間 多線程同步 ont 量化 訪問 本文將使用一個gitHub開源的組件技術來讀寫西門子plc數據,使用的是基於以太網的TCP/IP實現,不需要額外的組件,讀取操作只要放到後臺線程就不會卡死線程,本組件支持超級方便的高性能讀寫操作 githu

java小練習控制檯輸出猜一個數有猜大猜小提示

/* (程式頭部註釋開始) * 程式的版權和版本宣告部分 * Copyright (c) 2011, 煙臺大學計算機學院學生 * All rights reserved. * 檔名稱:

Java 8 Lambda類庫篇——Streams APICollector和並行

參考資料:1、背景自從lambda表示式成為Java語言的一部分之後,Java集合(Collections)API就面臨著大幅變化。為了不推到重來,所以對現有的API進行改進。為現有的介面(例如Collection,List和Stream)增加擴充套件方法;在類庫中增加新的流

多執行緒——暫停恢復停止執行緒較好的方式sleep/wait/yield區別

不推薦的 大家都知道:suspend()、resume()、stop()這些方法已經被廢棄了。suspend()、resume()如果使用不當,容易造成公共的同步物件資源的獨佔以及導致資料不同步。用官網的話說: This method has

Java Socket程式設計非阻塞多執行緒NIO

服務端:伺服器Server類public class Server implements Runnable { private int port; private volatile boolean stop; private Selector sele

深入理解Java 8 Lambda類庫篇——Streams APICollectors和並行

作者:Lucida 微博:@peng_gong 本文謝絕轉載,如需轉載需徵得作者本人同意,謝謝。 本文是深入理解Java 8 Lambda系列的第二篇,主要介紹Java 8針對新增語言特性而新增的類庫(例如Streams API、Collectors和並行)。 關於 Java SE 8增加了新的語言

Java 實現倒計時由秒計算天、小時、分鐘、秒

有時候會要求實現這樣一個需求: 天、小時、分鐘、秒的數值都是隔開的,伺服器端只返回一個時間戳長度。 以下就是我的實現方案,力求減少物件生成、減小計算量: import java.util.Timer; import java.util.TimerTask; publi

在spring中實現quartz2.2.1的動態排程開始暫停停止

需求: 需要在頁面設定某個時間,然後點選按鈕後,執行某個排程,並且可以在頁面刪除某個排程 1、導包 <dependency> <groupId>org.quartz-scheduler</groupId&

在spring中實現quartz的動態排程開始暫停停止

需求: 需要在頁面設定某個時間,然後點選按鈕後,執行某個排程,並且可以在頁面刪除某個排程 1、導包 <dependency> <groupId>org.quartz-scheduler</groupId> <

禁止了鼠標或者是手指滑動的默認事件後期需要恢復該怎麽做呢

b- class 今天 針對性 網頁 doc bind block prev 做前端開發,需要根據不同時期的需求做針對性的處理,特別是Javascript中的事件處理,如果剛開始禁止了鼠標或者是手指滑動的默認事件,後期需要恢復,該怎麽做呢?我今天做了下測試,沒什麽問題!

Java Number類數據類型的包裝類

spa byte unbox pre mask 編譯 http ati 類型 Java Number 一般地,當需要使用數字的時候,我們通常使用內置數據類型,如:byte、int、long、double等。 例如: int i = 5000; floa

java實現四則運算陳浩安&郭曉航

不能 乘除 img 編寫 同事 spec 充足 找到 設計文檔 github項目地址:https://github.com/wzl666A/myApp-master 一、項目簡介 實現一個自動生成小學四則運算題目的命令行程序 二、項目實現情況 1. 使用 -n 參數控制生成

Java學習日常page指令 跳轉指令 包含指令

學習內容 Page指令 ContentType 和 pageEncoding <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

java基礎 · 例項介面抽象類多型的結合

package v1; interface Animal{ void shout(); //介面中只宣告方法 void breatch(); void name(); } abstract class abstractclaaa implements

Java——String類總結的也是超級詳細了

一、String類-Java.long.String 1.1 String類的兩種例項化方式 a . 直接賦值,在堆上分配空間。 String str = "hello"; b . 傳統方法。通過構造方法例項化String類物件 String str1 = new St

Java學習流程圖學習路線、書籍、教程推薦

吸引 第2版 upload 圖片 linu 分布式架構 重構 相關 基礎 Java的火爆襲來,吸引了大批的初學者涉獵,想入行Java,卻苦於自己沒有基礎,擔心學不好。我告訴你,這些擔心都是浮雲,你只是懼怕走進一個新天地,人都是一樣的,面對自己不熟悉的領域總會有莫名的恐懼感。

JAVA程式設計基礎——抽象類、密封類和介面

一、抽象類 (一)抽象類:包含抽象方法的類稱為抽象類。 抽象類也要被abstract修飾,抽象類中可以有非抽象方法,抽象類不能建立例項物件。 abstract class Animal { public abstract void bark();//抽象方法 pub