Android_Timer与Runnable两种方法的定时器

先理清概念:

Timer是一个执行任务的类,他接受TimerTask的参数;

Timer执行任务有两种方式,一种是在某个指定的时候执行某个任务timer.schedule(Timertask task,Data data),另一种是在多长时间之后执行某个任务timer.schedule(TimerTask task,long delay);

TimerTask中执行指定的任务,但由于Android是线程安全的,所有的界面的更新都必须放到主线程中,所以要使用到Handler对象。

Android的CPU分配的最小单元是线程,Handler一般是在某个线程里创建的,因而Handler和Thread就是相互绑定的,一一对应。

而Runnable是一个接口,Thread是Runnable的子类。

下面是两种方法的例子

 1 package com.example.test007;
 2
 3 import java.util.Timer;
 4 import java.util.TimerTask;
 5
 6 import android.app.Activity;
 7 import android.os.Bundle;
 8 import android.os.Handler;
 9 import android.os.Message;
10 import android.os.SystemClock;
11 import android.widget.TextView;
12
13 public class MainActivity extends Activity {
14
15     private TextView tv;
16     private int time=0;
17
18     private final Timer timer=new Timer();
19     Handler handler=new Handler(){
20         @Override
21         public void handleMessage(Message msg){
22             ++time;
23            if(msg.what == 1){
24                 tv.setText("Handler,Timer以及TimeTask结合的方法:  "+ time);
25             }
26             super.handleMessage(msg);
27         }
28     };
29
30     //初始化计时器任务
31     TimerTask task =new TimerTask() {
32         @Override
33         public void run() {
34             //由于主线程安全,页面的更新需放到主线程中
35             Message msg =new Message();
36             msg.what=1;
37             handler.sendMessage(msg);
38         }
39     };
40     @Override
41     public void onCreate(Bundle savedInstanceState) {
42         super.onCreate(savedInstanceState);
43         setContentView(R.layout.activity_main);
44         tv = (TextView) findViewById(R.id.tv1);
45         //隔1s执行一次
46         timer.schedule(task, 1000, 1000);
47     }
48 }
 1 package com.example.test007;
 2
 3 import android.app.Activity;
 4 import android.os.Bundle;
 5 import android.os.Handler;
 6 import android.widget.TextView;
 7
 8 public class TimeActivity extends Activity {
 9     private TextView tv;
10     private int time=0;
11
12     private Handler handler = new Handler();
13     private Runnable runnable = new Runnable() {
14         @Override
15         public void run() {
16             ++time;
17             tv.setText("Handler的postDelayed(Runnable, long)方法 : "+ time);
18             handler.postDelayed(this, 1000);
19         }
20     };
21     @Override
22     protected void onCreate(Bundle savedInstanceState) {
23         super.onCreate(savedInstanceState);
24         setContentView(R.layout.test);
25         tv = (TextView) findViewById(R.id.tv);
26         handler.postDelayed(runnable, 1000);
27
28     }
29
30 }
时间: 2024-10-10 20:54:20

Android_Timer与Runnable两种方法的定时器的相关文章

实现多线程的两种方法:继承Thread类或实现Runnable接口

实现多线程的两种方法:继承Thread类或实现Runnable接口 Java中实现多线程有两种方法:继承Thread类和实现Runnable接口,在程序开发中只要是多线程,我们一般都是实现Runnable接口,原因归结为一点:实现接口比继承类要好. 多线程的第一种实现方式:继承Thread类 步骤如下 创建一个继承Thread的类(假定为A),并重写Thread的run方法 构造一个A类对象,假定为aa 调用aa的start方法.(start方法是从Thread继承过来的) 具体例子如下 pac

旧文备份:利用一个定时器实现多个虚拟定时器的两种方法

固定周期法 使用一个硬件定时器进行固定周期(比如1ms)定时,用一个结构体数组作为软定时器描述表,数组的结构体数就是最大虚拟定时器的数量,每个结构体的成员都包括虚拟定时器状态(空闲.激活.运行.超时触发.周期触发).定时值(换算成定时周期数,例如1ms的硬件定时周期,现进行125ms的定时,定时值就是125).标识ID和回调函数等:用一个变量作为定时周期计数器,每次进入定时中断,重置定时器,扫描结构体数组中的每个成员结构体,对定时值做减一操作,然后判断该定时值是否为0,是则判定该值对应的虚拟定时

线程的启动的两种方法,Runnable接口,run()的调用

实现并启动线程有两种方法1.写一个类继承自Thread类,重写run方法.用start方法启动线程2.写一个类实现Runnable接口,实现run方法.用new Thread(Runnable target).start()方法来启动 多线程原理:相当于玩游戏机,只有一个游戏机(cpu),可是有很多人要玩,于是,start是排队!等CPU选中你就是轮到你,你就run(),当CPU的运行的时间片执行完,这个线程就继续排队,等待下一次的run(). 调用start()后,线程会被放到等待队列,等待C

Android第五期 - 更新自己的apk本地与网络两种方法

首先是本地: ParseXmlService部分: package com.szy.update; import java.io.InputStream; import java.util.HashMap; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.w3c.dom.Document; import org.w3c.dom.Element

(转)java创建线程的两种方法比较

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法:  ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承

Android更新UI的两种方法——handler与runOnUiThread()

在Android开发过程中,常需要更新界面的UI.比如网络请求操作.一些耗时操作都不能放在UI线程中运行的,需要放在子线程,而子线程又不能更新UI界面,这是我们需要引入一个Handler,消息处理机制.更新UI是要主线程(UI线程)来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面显示常会报错.抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that create

Android 更新UI的两种方法——handler和runOnUiThread() - $firecat的代码足迹$ - 博客频道 - CSDN.NET

文章来源:http://www.2cto.com/kf/201302/190591.html Android 更新UI的两种方法——handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面显示常会报错.抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread th

Java 创建线程的两种方法

Java提供了线程类Thread来创建多线程的程序.其实,创建线程与创建普通的类的对象的操作是一样的,而线程就是Thread类或其子类的实例对象.每个Thread对象描述了一个单独的线程.要产生一个线程,有两种方法: ◆需要从Java.lang.Thread类派生一个新的线程类,重载它的run()方法: ◆实现Runnalbe接口,重载Runnalbe接口中的run()方法. 为什么Java要提供两种方法来创建线程呢?它们都有哪些区别?相比而言,哪一种方法更好呢? 在Java中,类仅支持单继承,

Android 更新UI的两种方法——handler和runOnUiThread(

Android 更新UI的两种方法——handler和runOnUiThread() 在Android开发过程中,常需要更新界面的UI.而更新UI是要主线程来更新的,即UI线程更新.如果在主线线程之外的线程中直接更新页面显示常会报错.抛出异常:android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views