導航:首頁 > 操作系統 > android時間計時

android時間計時

發布時間:2022-09-27 00:35:08

android中計時器總結

java.util.Timer 的源碼中看到Timer的構造方法

我們要用到的schele()方法如下:

另外Timer調用task還有以下方法

兩秒鍾之後timer_tv_1開始顯示當前時間並每一秒更新一次

別忘了在onDestroy()中

Ⅱ android 倒計時器 設計

有三種實現方式:

第一種:通過Timer與TimerTask結合的方式進行實現
第二種:通過Handler與Message方式進行實現
第三種:通過CountdownTimer進行實現
示例
第一種:
timer.schele(task, 1000, 1000); // timeTask ,一秒執行一次,
TimerTask task = new TimerTask() {
@Override
public void run() {
}
}
第二種:
handler.sendMessageDelayed(message, 1000); //1秒後發送消息
final Handler handler = new Handler(){
public void handleMessage(Message msg){ // handle message
switch (msg.what) {
case 1:
recLen--;
if(recLen > 0){ //如果倒計時沒到
Message message = handler.obtainMessage(1);
handler.sendMessageDelayed(message, 1000); // 1秒後發送消息
}
}
super.handleMessage(msg);
}
};
第三種:
new CountdownTimer(30000, 1000) { //30秒倒計時,沒秒執行一次
public void onTick(long millisUntilFinished) { //每秒執行一次進該方法
mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() { //倒計時結束。
mTextField.setText("done!");
}
}.start();

Ⅲ Android倒計時怎麼實現

安卓實現同時多個倒計時效果的步驟:
我們首先需要在輸入框中輸入一個秒數,比如:12,然後獲取輸入框中的值,顯示在一個TextView中;
點擊「開始倒計時」按鈕,每隔一秒鍾,秒數減1,然後顯示在TextView中;
點擊「停止倒計時」按鈕,計時器停止運行,當再次點擊「開始倒計時」按鈕,計時器繼續運行。
平時用的每個商品都應該有兩個屬性值,這里叫它deadLine和isOvere吧,表示商品的到期時間和是否到期,那麼倒計時可以考慮這么實現:設置一個主計時器,每隔1秒發出消息告訴GridView現在的時間,GridView的Item獲得這個時間之後就和deadLine比較,如果已經到deadline了,就把數據源中的這項標記成已到期(修改isOvere的值為true);沒到deadline,就計算還差多少時間,顯示到GridView的Item里。

Ⅳ Android倒計時怎麼實現

方法一:
利用java的類Timer,TimerTask還有android的Handler
界面welcome_activity.xml
<?xml version="1.0" encoding="utf-8"?>
<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">

<TextView
android:id="@+id/count_down"
android:layout_width="60dp"
android:layout_height="60dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:layout_marginRight="16dp"
android:layout_marginTop="16dp"
android:gravity="center"
android:textSize="32sp"
android:textColor="#50000000"
android:background="@drawable/count_down_background"
tools:text="2"
/>
</RelativeLayout>

package com.example.counttimer;
import java.util.Date;
import java.util.Timer;
import java.util.TimerTask;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.view.Menu;
import android.view.MenuItem;
import android.view.Window;
import android.widget.TextView;

public class WelcomeActivity extends Activity {
private final static int COUNT = 1;
private TextView countDown;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_welcome);
initView();
}
//sehele的第而個參數是第一次啟動延時的時間,第三個是每隔多長時間執行一次。單位都是ms。//因此這里是每一秒發送一次消息給handler更新UI。//然後三秒後時間到了,在timer的第二個sehele中進行跳轉到另外一個界面
private void initView() {
countDown = (TextView) findViewById(R.id.count_down);
final Timer timer = new Timer();
final long end = System.currentTimeMillis() + 1000*3;
timer.schele(new TimerTask() {
@Override
public void run() {
handler.sendEmptyMessage(COUNT);

}
}, 0, 1000);
//這里的schele的第二個參數意義是到了這個時間盡快運行run裡面的方法
timer.schele(new TimerTask() {

@Override
public void run() {
Intent i = new Intent(WelcomeActivity.this, SecondActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
finish();
timer.cancel();
}
}, new Date(end));

}

private Handler handler = new Handler(){
int num = 2;
public void handleMessage(android.os.Message msg) {

switch (msg.what) {
case COUNT:
countDown.setText(String.valueOf(num));
num--;
break;

default:
break;
}
};
};

}

count_down_background.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners
android:radius="8dp"/>

<solid
android:color="#1e000000"/>
</shape>

方法二 :

利用android封裝的類CountDownTimer。其實內部也是用Handler實現的。其他都一樣。

package com.example.counttimer;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.CountDownTimer;
import android.view.Window;
import android.widget.TextView;

public class WelcomeActivity extends Activity {
private final static int COUNT = 1;
private TextView countDown;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_welcome);
initView();
}

private void initView() {
countDown = (TextView) findViewById(R.id.count_down);//CountDownTimer構造器的兩個參數分別是第一個參數表示總時間,第二個參數表示間隔時間。//意思就是每隔xxx會回調一次方法onTick,然後xxx之後會回調onFinish方法。
CountDownTimer timer = new CountDownTimer(3200,1000) {
int num = 2;
@Override
public void onTick(long millisUntilFinished) {
countDown.setText(String.valueOf(num));
num--;
}

@Override
public void onFinish() {//計時完成調用
Intent i = new Intent(WelcomeActivity.this, SecondActivity.class);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(i);
finish();
}
};
timer.start();
}

}

Ⅳ android 裡面的計時器

沒明白你到底想問的是什麼?
5秒間隔本身是ANdroid定義的系統不相應時間

Ⅵ Android將倒計時做到極致

在開發倒計時功能時往往我們會為了方便直接使用CountDownTimer或者使用Handler做延時來實現,當然CountDownTimer內部封裝也是使用的Handler。

如果只是做次數很少的倒計時或者不需要精確的倒計時邏輯那倒沒關系,比如說我只要倒計時10秒,或者我大概5分鍾請求某個介面

但是如果是需要做精確的倒計時操作,比如說手機發送驗證碼60秒,那使用現有的倒計時方案就會存在問題。可能有些朋友沒有注意到這一點,下面我們就來簡單分析一下現有倒計時的問題。

這個可能是用得最多的,因為方便嘛。但其實倒計時每一輪倒計時完之後都是存在誤差的,如果看過CountDownTimer的源碼你就會知道,他的內部是有做 校準操作 的。(源碼很簡單這里就不分析了)
但是如果你認真的測試過CountDownTimer,你就會發現,即便它內部有做校準操作,他的沒一輪都是有偏差,只是他最後一次倒計時完之後的總共時間和開始倒計時的時間相比沒偏差。
什麼意思呢,意思就是1秒,2.050秒,3.1秒......,這樣的每輪偏差,導致他會出現10.95秒,下一次12秒的情況,那它的回調中如果你直接做取整就會出現少一秒的情況,但實際是沒少的。
這只是其中的一個問題,你可以不根據它的回調做展示,自己用一個整形累加做展示也能解決。但是他還有個問題,有概率直接出現跳秒,就是比如3秒,下次直接5秒,這是實際的跳秒,是少了一次回調的那種。
跳秒導致你如果直接使用它可能會大問題,你可能自測的時候沒發現,到時一上線應用在用戶那概率跳秒,那就蛋疼了。

不搞這么多花里胡哨的,直接使用Handler來實現,會有什麼問題。
因為直接使用handler來實現,沒有校準操作,每次循環會出現幾毫秒的誤差,雖然比CountDownTimer的十幾毫秒的誤差要好, 但是在基數大的倒計時情況下誤差會累計,導致最終結果和現實時間差幾秒誤差,時間越久,誤差越大

直接使用Timer也一樣,只不過他每輪的誤差更小,幾輪才有1毫秒的誤差,但是沒有校準還是會出現誤差累計,時間越久誤差越大。

既然無法直接使用原生的,那我們就自己做一個。
我們基於Handler進行封裝,從上面可以看出主要為了解決兩個問題,時間校準和跳秒。自己寫一個CountDownTimer

思路就是在倒計時開始前獲取一次SystemClock.elapsedRealtime(),沒輪倒計時再獲取一次SystemClock.elapsedRealtime()相減得到誤差,根據delay校準。然後使用while循壞來處理跳秒的操作,與原生的CountDownTimer不同,這里如果跳了多少秒,就會返回多少次回調。

Ⅶ Android計時器問題

public boolean onTouch(View arg0, MotionEvent arg1)
{
if(flag){
flag = false;
timer,cancel();
SimpleDateFormat b = new SimpleDateFormat("HH:mm:ss");
Date currentTime = new Date();
String s2 = b.format(currentTime);
cantime1.setStatus(s2);//顯示當前時間
}else{
flag = true;
}
return flag;
}
好像不對,總之你要暫停的時候就用timer.cancel();只要miss在就能記住之前的狀態了,計時器再開的時候再setTimerTask

Ⅷ android中怎麼實現倒計時怎麼按照小時分鍾

Android實現計時與倒計時的五種方法:

方法一
Handler與Message(不用TimerTask)

public class timerTask extends Activity{
private int recLen = 11;
private TextView txtView;

public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

setContentView(R.layout.timertask);
txtView = (TextView)findViewById(R.id.txttime);

Message message = handler.obtainMessage(1); // Message
handler.sendMessageDelayed(message, 1000);
}

final Handler handler = new Handler(){

public void handleMessage(Message msg){ // handle message
switch (msg.what) {
case 1:
recLen--;
txtView.setText("" + recLen);

if(recLen > 0){
Message message = handler.obtainMessage(1);
handler.sendMessageDelayed(message, 1000); // send message
}else{
txtView.setVisibility(View.GONE);
}
}

super.handleMessage(msg);
}
};
}
linux

方法二
Handler與Thread(不佔用UI線程)

public class timerTask extends Activity{
private int recLen = 0;
private TextView txtView;

public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

setContentView(R.layout.timertask);
txtView = (TextView)findViewById(R.id.txttime);

new Thread(new MyThread()).start(); // start thread
}

final Handler handler = new Handler(){ // handle
public void handleMessage(Message msg){
switch (msg.what) {
case 1:
recLen++;
txtView.setText("" + recLen);
}
super.handleMessage(msg);
}
};

public class MyThread implements Runnable{ // thread
@Override
public void run(){
while(true){
try{
Thread.sleep(1000); // sleep 1000ms
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}catch (Exception e) {
}
}
}
}
}

方法三
Timer與TimerTask(Java實現)

public class timerTask extends Activity{

private int recLen = 11;
private TextView txtView;
Timer timer = new Timer();

public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

setContentView(R.layout.timertask);
txtView = (TextView)findViewById(R.id.txttime);

timer.schele(task, 1000, 1000); // timeTask
}

TimerTask task = new TimerTask() {
@Override
public void run() {

runOnUiThread(new Runnable() { // UI thread
@Override
public void run() {
recLen--;
txtView.setText(""+recLen);
if(recLen < 0){
timer.cancel();
txtView.setVisibility(View.GONE);
}
}
});
}
};
}
方法四
TimerTask與Handler(不用Timer的改進型)

public class timerTask extends Activity{
private int recLen = 11;
private TextView txtView;
Timer timer = new Timer();

public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

setContentView(R.layout.timertask);
txtView = (TextView)findViewById(R.id.txttime);

timer.schele(task, 1000, 1000); // timeTask
}

final Handler handler = new Handler(){
@Override
public void handleMessage(Message msg){
switch (msg.what) {
case 1:
txtView.setText(""+recLen);
if(recLen < 0){
timer.cancel();
txtView.setVisibility(View.GONE);
}
}
}
};

TimerTask task = new TimerTask() {
@Override
public void run() {
recLen--;
Message message = new Message();
message.what = 1;
handler.sendMessage(message);
}
};
}
方法五
Handler與Runnable(最簡單型)

public class timerTask extends Activity{
private int recLen = 0;
private TextView txtView;

public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);

setContentView(R.layout.timertask);
txtView = (TextView)findViewById(R.id.txttime);

handler.postDelayed(runnable, 1000);
}

Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
recLen++;
txtView.setText("" + recLen);
handler.postDelayed(this, 1000);
}
};
}
計時與倒計時

方法1,方法2和方法3,都是倒計時

方法4,方法5,都是計時

計時和倒計時,都可使用上述方法實現(代碼稍加改動)

UI線程比較

方法1,方法2和方法3,都是在UI線程實現的計時;

方法4和方法5,是另開Runnable線程實現計時

實現方式比較

方法1,採用的是Java實現,即Timer和TimerTask方式;

其它四種方法,都採用了Handler消息處理

推薦使用

如果對UI線程交互要求不很高,可以選擇方法2和方法3

如果考慮到UI線程阻塞,嚴重影響到用戶體驗,推薦使用方法4,另起線程單獨用於計時和其它的邏輯處理

方法5,綜合了前幾種方法的優點,是最簡的

Ⅸ 怎麼在android里顯示一個計時器

public
boolean
ontouch(view
arg0,
motionevent
arg1)
{
if(flag){
flag
=
false;
timer,cancel();
simpledateformat
b
=
new
simpledateformat("hh:mm:ss");
date
currenttime
=
new
date();
string
s2
=
b.format(currenttime);
cantime1.setstatus(s2);//顯示當前時間
}else{
flag
=
true;
}
return
flag;
}
好像不對,總之你要暫停的時候就用timer.cancel();只要miss在就能記住之前的狀態了,計時器再開的時候再settimertask

Ⅹ android中怎麼使timecount自動開始計時

android計時器,時間計算器的實現方法,需要的朋友可以參考一下

需求:默認為"00:00:00",點擊開始按鈕時清零後開始計時,出現如10:28:34。點擊停止的時候停止計時。
問題:使用Calendar
DateFormat的方法,不設置時區獲取到的小時是本地時區的(東八區的就是8),設置成GMT標准時區獲取到的時間是12小時(12:00:00),設置24小時制無效。
在開始時間加減各種小時都無效,而且計時只能到12小時就自動跳上去了,始終無法出現默認狀態00:00:00開始計時的效果。
嘗試各種時間設置方法無效後只能自己寫一個根據秒數轉換時間格式字元串的方法了,經過測試是沒問題的,兩位數只能顯示99小時為最大,如需要更大小時數需要改改方法。
另外小時數也不能無限大,超過long數據類型長度會變成負數的,會出現異常的。

顯示效果:

測試類:

復制代碼
代碼如下:

public class TestTime {
public
static void main(String[] args) {
TestTime tt = new
TestTime();
tt.showTimeCount(99*3600000+75*1000);

}

//時間計數器,最多隻能到99小時,如需要更大小時數需要改改方法
public String
showTimeCount(long time) {

System.out.println("time="+time);
if(time >=
360000000){
return "00:00:00";
}
String
timeCount = "";
long hourc = time/3600000;
String hour =
"0" + hourc;
System.out.println("hour="+hour);
hour =
hour.substring(hour.length()-2, hour.length());

System.out.println("hour2="+hour);

long minuec =
(time-hourc*3600000)/(60000);
String minue = "0" +
minuec;
System.out.println("minue="+minue);
minue =
minue.substring(minue.length()-2, minue.length());

System.out.println("minue2="+minue);

long secc =
(time-hourc*3600000-minuec*60000)/1000;
String sec = "0" +
secc;
System.out.println("sec="+sec);
sec =
sec.substring(sec.length()-2, sec.length());

System.out.println("sec2="+sec);
timeCount = hour + ":" + minue +
":" + sec;
System.out.println("timeCount="+timeCount);

return timeCount;
}

}

實際例子:

復制代碼
代碼如下:

//時間計數器,最多隻能到99小時,如需要更大小時數需要改改方法

public String showTimeCount(long time) {
if(time >=
360000000){
return "00:00:00";
}
String
timeCount = "";
long hourc = time/3600000;
String hour =
"0" + hourc;
hour = hour.substring(hour.length()-2,
hour.length());

long minuec =
(time-hourc*3600000)/(60000);
String minue = "0" +
minuec;
minue = minue.substring(minue.length()-2,
minue.length());

long secc =
(time-hourc*3600000-minuec*60000)/1000;
String sec = "0" +
secc;
sec = sec.substring(sec.length()-2, sec.length());

timeCount = hour + ":" + minue + ":" + sec;
return
timeCount;
}

private Handler stepTimeHandler;

private Runnable mTicker;
long startTime = 0;

//開始按鈕

class startBtnListener implements OnClickListener {

@Override
public void onClick(View v) {
Button b =
(Button)v;
String buttonText =
b.getText().toString();

if("Start".equalsIgnoreCase(buttonText)){

b.setText("Stop");
// 清零 開始計時

stepTimeTV.setText("00:00:00");
stepTimeHandler = new
Handler();
startTime =
System.currentTimeMillis();
mTicker = new Runnable()
{
public void run() {
String
content = showTimeCount(System.currentTimeMillis() -
startTime);

stepTimeTV.setText(content);

long now =
SystemClock.uptimeMillis();
long next = now + (1000
- now % 1000);
stepTimeHandler.postAtTime(mTicker,
next);
}
};

//啟動計時線程,定時更新
mTicker.run();

}else{
b.setText("Start");
//停止計時 Remove
any pending posts of Runnable r that are in the message
queue.

stepTimeHandler.removeCallbacks(mTicker);
}

}
}

用時間格式化的方式測試代碼:

復制代碼
代碼如下:

//開始按鈕 通過Calendar時間設置的方式,無法正常顯示小時為0

class startBtnListener implements OnClickListener {

@Override
public void onClick(View v) {
Button b =
(Button)v;
String buttonText =
b.getText().toString();

if("Start".equalsIgnoreCase(buttonText)){

b.setText("Stop");
// 清零 開始計時

stepTimeTV.setText("00:00:00");
if (mCalendar == null)
{
mCalendar =
Calendar.getInstance();
TimeZone tz =
TimeZone.getTimeZone("GMT");//GMT+8

mCalendar.setTimeZone(tz);

mCalendar.get(Calendar.HOUR_OF_DAY);//24小時制

}
stepTimeHandler = new Handler();

//System.uptimeMillis()
//記錄從機器啟動後到現在的毫秒數,當系統進入深度睡眠時,此計時器將會停止

//System.currentTimeMillis()
//返回自1970年1月1日到現在的毫秒數,通常用來設置日期和時間
//System.elapsedRealtime()
//返回從機器啟動後到現在的毫秒數,包括系統深度睡眠的時間,api里沒有這個方法

//直接取得的是當地時區時間,當地時間跟時區有關,設置GMT後始終多12小時
startTime =
System.currentTimeMillis();//12*3600000 - 36*3600000減掉或者加上12小時都不行

mTicker = new Runnable() {
public
void run() {
//這個減出來的日期是1970年的 時間格式不能出現00:00:00
12:00:00
long showTime = System.currentTimeMillis()
- startTime;

Log.i(TAG,showTime+"");

mCalendar.setTimeInMillis(showTime + 13*3600000 +
1000);
String content = (String)
DateFormat.format(mFormat, mCalendar);

stepTimeTV.setText(content);

long now =
SystemClock.uptimeMillis();
long next = now + (1000
- now % 1000);
stepTimeHandler.postAtTime(mTicker,
next);
}
};

//啟動計時線程,定時更新
mTicker.run();

}else{
b.setText("Start");
//停止計時 Remove
any pending posts of Runnable r that are in the message
queue.

stepTimeHandler.removeCallbacks(mTicker);
}

}
}

private Handler stepTimeHandler;
Calendar
mCalendar;
String mFormat = "yyyy-MM-dd hh:mm:ss";//yyyy-MM-dd

long startTime = 0;
private Runnable mTicker;

閱讀全文

與android時間計時相關的資料

熱點內容
bs刷裝備建立後文件夾沒有 瀏覽:77
找漫畫看應該下載什麼app 瀏覽:182
如何在vps上搭建自己的代理伺服器 瀏覽:744
nginxphp埠 瀏覽:403
內臟pdf 瀏覽:152
怎麼看雲伺服器架構 瀏覽:85
我的世界國際服為什麼登不進伺服器 瀏覽:996
微盟程序員老婆 瀏覽:930
intellij創建java 瀏覽:110
java連接odbc 瀏覽:38
啟動修復無法修復電腦命令提示符 瀏覽:359
手機編程是什麼 瀏覽:98
山東移動程序員 瀏覽:163
蘇州java程序員培訓學校 瀏覽:479
單片機液晶驅動 瀏覽:856
魔拆app里能拆到什麼 瀏覽:132
新預演算法的立法理念 瀏覽:144
wdcpphp的路徑 瀏覽:136
單片機p0口電阻 瀏覽:927
瀏覽器中調簡訊文件夾 瀏覽:595