`

Android定时器实现的几种方法

阅读更多

实现定时器有很多种方式,在这里我简单的介绍几种方式 
(1)使用Handler + Runnable的方式 

复制代码代码如下:

Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 

@Override 
public void run() { 
//你要做的事 
//...... 
System.out.println(Thread.currentThread().getName()); 
handler.postDelayed(runnable, 1000); 

}; 


然后调用handler.post(runnable);就能启动定时器,这里是每隔1s打印线程名字,从打印中我们可以知道,他并没有另开线程,而是运行在UI线程当中,当你要取消定时器的时候,只需要调用handler.removeCallbacks(runnable)就可以了。 
上面中有一个问题,有时候你会发现removeCallbacks有时候会失效,不能从消息队列中移除,看下面的demo
 
图:两个按钮,一个将Runnable加到消息队列中,一个将Runnable从消息队列中移除。该Runnable每1秒钟打印一次日志。 

复制代码代码如下:

<SPAN style="FONT-FAMILY: Courier New">package com.example.demoactivity; 
import android.app.Activity; 
import android.os.Bundle; 
import android.os.Handler; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.Button; 
public class TimerActivity extends Activity{ 
Handler handler = new Handler(); 
Runnable runnable = new Runnable() { 

@Override 
public void run() { 
System.out.println("update..."); 
handler.postDelayed(runnable, 1000); 

}; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.timer); 

Button mButtonStart = (Button) findViewById(R.id.button1); 
Button mButtonStop = (Button) findViewById(R.id.button2); 

mButtonStart.setOnClickListener(new OnClickListener() { 

@Override 
public void onClick(View v) { 
handler.post(runnable); 

}); 

mButtonStop.setOnClickListener(new OnClickListener() { 

@Override 
public void onClick(View v) { 
handler.removeCallbacks(runnable); 

}); 


}</SPAN><SPAN style="FONT-FAMILY: Georgia, 'Times new roman', Times, san-serif"> 
</SPAN> 


结果: 
(1)start –> 输出 –> stop–> 停止输出 
(2)start –> 输出 –> Background –> Front –> stop->继续输出 
当Activity进入后台运行后再转入前台运行,removeCallbacks无法将updateThread从message queue中移除。 
这是为什么呢? 
在Activity由前台转后台过程中,线程是一直在运行的,但是当Activity转入前台时会重新定义Runnable runnable;也就是说此时从message queue移除的runnable与原先加入message queue中的runnable并非是同一个对象。如果把runnable定义为静态的则removeCallbacks不会失效,对于静态变量在内存中只有一个拷贝(节省内存),JVM只为静态分配一次内存,在加载类的过程中完成静态变量的内存分配,我们做如下修改就能解决上面的这个问题 

复制代码代码如下:

static Handler handler = new Handler(); 
static Runnable runnable = new Runnable() { 

@Override 
public void run() { 
System.out.println("update..."); 
handler.postDelayed(runnable, 1000); 

}; 


(2)使用Timer的方式 

复制代码代码如下:

Timer timer = new Timer(); 
timer.schedule(new TimerTask() { 

@Override 
public void run() { 
System.out.println("update...."); 

}, 0, 1000); 


上面的每一秒打印语句,run方法是运行在子线程,不能直接在里面更新UI操作,这里需要注意下,取消的话调用timer.cancel()就能移除任务了 
(3)采用Handle与线程的sleep(long )方法 
1.定义一个Handler类,用于处理接受到的Message 

复制代码代码如下:

Handler handler = new Handler() { 
public void handleMessage(Message msg) { 
super.handleMessage(msg); 
System.out.println("update..."); 


2.新建一个实现Runnable接口的线程类,用一个boolean 来控制线程开始和结束 boolean isLive = true如下: 

复制代码代码如下:

public class MyThread implements Runnable { 
@Override 
public void run() { 
while (isLive) { 
try { 
Thread.sleep(1000);// 线程暂停1秒,单位毫秒 
Message message = new Message(); 
message.what = 1; 
handler.sendMessage(message);// 发送消息 
} catch (InterruptedException e) { 
e.printStackTrace(); 




3.在需要启动线程的地方加入下面语句 

复制代码代码如下:

new Thread(new MyThread()).start(); 


4.取消的话将isLive设置为false就行了 
今天主要介绍这三种方法,写的不好的地方希望大家指出,谢谢!

分享到:
评论

相关推荐

    android 定时器的三种方法

    在android中,经常用到的定时器主要有以下几种实现: 一、采用Handler与线程的sleep(long )方法 二、采用Handler的postDelayed(Runnable, long) 方法 三、采用Handler与timer及TimerTask结合的方法。 三种方法都有...

    android多种定时器实现

    android实现定时器有很多种,例子中选了Timer、CountDownTimer、handler+postDelay、handler+handler等几种实现了一下,欢迎下载!

    Android 实现定时器的四种方式总结及实现实例

    Android中实现定时器的四种方式 第一种方式利用Timer和TimerTask 1、继承关系 java.util.Timer 基本方法 schedule 例如: timer.schedule(task, delay,period); //delay为long,period为long:从现在起过delay毫秒...

    详解Android实现定时器的几种方法

    本篇文章主要介绍了详解Android实现定时器的几种方法,主要包括了Handler, Timer, Thread, AlarmManager,有兴趣的可以了解一下

    Android定时器实现的几种方式整理及removeCallbacks失效问题解决

    本文为大家详细介绍下Android 定时器实现的几种方式:Handler + Runnable、Timer的方式、Handle与线程的sleep(long )方法和removeCallbacks失效问题如何解决

    定时器理论

    android几种定时器机制及区别,喜欢可以下载,需要技术支持可以加qq联系我。

    Android 进程保活几种方案.zip

    Android 进程保活,点击home键 或者 点击back键盘 、锁屏、息屏保证服务器定时器不会阻塞,博客地址:https://blog.csdn.net/dreams_deng/article/details/106213951

    基于Android操作系统的智能手机开发

    4. 加分系统——击中敌方汽车或是吃到宝贝(几种不同的汽车分数不同) 5. 障碍物——汽车隐身(草坪)、子弹击破(砖墙)、子弹打不破(铁墙) 6. 音效snd1—snd2格式为midi用于过场音乐及子弹发射、爆炸音效

    Android 使用viewpager实现无限循环(定时+手动)

    循环轮播的方法有两种,一种是使用定时器另外一种是使用手指拨动,相比较而言,定时器实现循环播放比较容易,只要在定时器的消息里加上简单几段代码即可,下面分别就这两种方法给大家详解,具体详情请看下文吧。...

    Android 开发延时调用的几种方法

    本文参考网上,整理了一下几点,供广大安卓开发者参考,希望对读者有所帮助。 一、开启新线程  new Thread(new Runnable(){ public void run(){ Thread.sleep(XXXX); handler.sendMessage(); //告诉主线程执行任务...

    alarmmanager(包括api19之前和之后)共有五种

    alarmmanager 计时器,android自己的计时器,区别于timer,,包括在api19之前的两种方式,以及api19之后的两种(都是单次的),主要运用的也就是这几种。还有api19后的重复执行的实现。(结果在应用中用文字表述了)...

    后台定时定位开机自启系统.zip

    后台定时定位开机自启系统android 类库中, 虽然已经提供了几种定位方式,但是从提供的功能和反应速度上,和其他的第三方定位库相比,还是相形见绌。搜索了几个第三方定位和地图的API平台,综合考虑了下,选择了百度...

    Android 简单封装获取验证码倒计时功能

    如图所示的效果相信大家都不陌生,我们可以使用很多种方法去实现此效果,这里自己采用 CountDownTimer 定时器简单封装下此效果,方便我们随时调用。 首页先在 attrs.xml 中定义下所需的几个属性: &lt;attr...

    网狐荣耀版开发使用常见问题解答

    第二,右键项目,选择export,进入下图界面,选择android,然后再选择Export Android Application,然后选择下一步,这里默认,再进行下一步。 第三步,这里选择Create new keystore,Location选择存储路径,...

    JAVA上百实例源码以及开源项目

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

    JAVA上百实例源码以及开源项目源代码

    像坐标控制、旋转矩阵、定时器、生成图像、数据初始化、矩阵乘法、坐标旋转、判断是否是顺时针方向排列、鼠标按下、放开时的动作等,都可在本源码中得以体现。 Java编写的显示器显示模式检测程序 2个目标文件 内容...

Global site tag (gtag.js) - Google Analytics