基于Android中实现定时器的3种解决方法

在Android开发中,定时器一般有以下3种实现方法:
一、采用Handler与线程的sleep(long)方法
二、采用Handler的postDelayed(Runnable, long)方法
三、采用Handler与timer及TimerTask结合的方法
下面逐一介绍:
一、采用Handle与线程的sleep(long)方法
Handler主要用来处理接受到的消息。这只是最主要的方法,当然Handler里还有其他的方法供实现,有兴趣的可以去查API,这里不过多解释。
1. 定义一个Handler类,用于处理接受到的Message。


代码如下:

Handler handler = new Handler() {
    public void handleMessage(Message msg) {
        // 要做的事情
        super.handleMessage(msg);
    }
};

2. 新建一个实现Runnable接口的线程类,如下:


代码如下:

public class MyThread implements Runnable {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        while (true) {
            try {
                Thread.sleep(10000);// 线程暂停10秒,单位毫秒
                Message message = new Message();
                message.what = 1;
                handler.sendMessage(message);// 发送消息
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
}

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


代码如下:

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

4. 启动线程后,线程每10s发送一次消息。二、采用Handler的postDelayed(Runnable, long)方法
这个实现比较简单一些。
1. 定义一个Handler类


代码如下:

Handler handler=new Handler();
Runnable runnable=new Runnable() {
    @Override
    public void run() {
        // TODO Auto-generated method stub
        //要做的事情
        handler.postDelayed(this, 2000);
    }
};

2. 启动计时器


代码如下:

handler.postDelayed(runnable, 2000);//每两秒执行一次runnable

3. 停止计时器


代码如下:

handler.removeCallbacks(runnable);

三、采用Handler与timer及TimerTask结合的方法
1. 定义定时器、定时器任务及Handler句柄


代码如下:

private final Timer timer = new Timer(); 
private TimerTask task; 
Handler handler = new Handler() { 
    @Override
    public void handleMessage(Message msg) { 
        // TODO Auto-generated method stub 
        // 要做的事情 
        super.handleMessage(msg); 
    }
};

2. 初始化计时器任务


代码如下:

task = new TimerTask() { 
    @Override
    public void run() { 
        // TODO Auto-generated method stub 
        Message message = new Message(); 
        message.what = 1; 
        handler.sendMessage(message); 
    } 
};

3. 启动定时器


代码如下:

timer.schedule(task, 2000, 2000);

简要说一下上面三步提到的一些内容:
1. 定时器任务(TimerTask)顾名思义,就是说当定时器到达指定的时间时要做的工作,这里是想Handler发送一个消息,由Handler类进行处理。
2. java.util.Timer.schedule(TimerTask task, long delay):这个方法是说,dalay/1000秒后执行task.只执行一次。
java.util.Timer.schedule(TimerTask task, long delay, long period):这个方法是说,delay/1000秒后执行task,然后进过period/1000秒再次执行task,这个用于循环任务,执行无数次,当然,你可以用timer.cancel();取消计时器的执行。

(0)

相关推荐

  • Android中PopuWindow实现下拉列表实例

    前言 之前讲过一篇关于PopuWindow的基本使用的文章,想了解的同学可以参考:PopupWindow的基本使用 其实,下拉列表Spanner(不知道控件拼写是否正确)就能实现,但是基于ui美化方面的考虑,用popuwindow实现是一个不错的选择,今天就来讲讲PopuWindow实现下拉列表的具体实现吧. 正文 文章可能会有点长,大家将就着看吧.先上波效果图才是厚道的: 下面开始正式讲解. 基础依赖,由于下拉列表是用RecycleView实现,然后控件初始化用到ButterKnife,所以要

  • Android7.0 MessageQueue详解

    Android中的消息处理机制大量依赖于Handler.每个Handler都有对应的Looper,用于不断地从对应的MessageQueue中取出消息处理. 一直以来,觉得MessageQueue应该是Java层的抽象,然而事实上MessageQueue的主要部分在Native层中. 自己对MessageQueue在Native层的工作不太熟悉,借此机会分析一下. 一.MessageQueue的创建 当需要使用Looper时,我们会调用Looper的prepare函数: public stati

  • Android圆形头像拍照后“无法加载此图片”的问题解决方法(适配Android7.0)

    Feature: 点击选择拍照或者打开相册,选取图片进行裁剪最后设置为圆形头像. Problem: 拍好照片,点击裁剪,弹Toast"无法加载此图片". Solution: 在裁剪的class里加两行代码 intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION); 主要代码如下: public static final S

  • Android7.0上某些PopuWindow出现显示位置不正确问题的解决方法

    本文实例讲述了Android7.0上某些PopuWindow出现显示位置不正确问题的解决方法.分享给大家供大家参考,具体如下: 情景描述: 在andorid7.0及以上系统,点击某个view,本来期待有一个Popuwindow在该view下面弹出(调用PopuWindow.showAsDropDown(view)方法)但结果PopuWindow却弹出在view上方,顶在系统状态栏下面. 原因分析: 在android7.0上,如果不主动约束PopuWindow的大小,比如,设置布局大小为 MATC

  • Android Studio的中文乱码问题解决方法

    Android Studio安装后发现所有的中文,不管是界面上的还是输出的log中的中文都变成小框框  可以肯定是字体的问题 解决:菜单File->settings对话框,切换到Appearance标签  选择override default fonts by, 先随便选择一个中文字体(PS:小框框都是中文字 呵呵),保存,重启软件,即可.

  • Android7.0 工具类:DiffUtil详解

    一 概述 DiffUtil是support-v7:24.2.0中的新工具类,它用来比较两个数据集,寻找出旧数据集->新数据集的最小变化量. 说到数据集,相信大家知道它是和谁相关的了,就是我的最爱,RecyclerView. 就我使用的这几天来看,它最大的用处就是在RecyclerView刷新时,不再无脑mAdapter.notifyDataSetChanged(). 以前无脑mAdapter.notifyDataSetChanged()有两个缺点: 1.不会触发RecyclerView的动画(删

  • Android Activity切换(跳转)时出现黑屏的解决方法 分享

    在两个Activity跳转时,由于第二个Activity在启动时加载了较多数据,就会在启动之前出现一个短暂的黑屏时间,解决这个问题比较简单的处理方法是将第二个Activity的主题设置成透明的,这样在启动第二个Activity时的黑屏就变成了显示第一个Activity界面.这个分两步完成:第一步:xxx/res/values/styles.xml中加入自定义Activity的Theme,如下所示: [html]  <style name="Transparent" parent=

  • 适配android7.0获取文件的Uri的方法

    前言# Android 7.0已经发布很久了,虽然市场份额还不是很高,但是流行起来都是早晚的事,所以适配Android 7.0刻不容缓. Android 7.0 对系统进行了很多的优化:例如文件访问权限,省电,网络,后台等等,其中最突出的就是应用外的Uri访问. 什么时候会用到Uri的应用外访问呢?举一个简单的例子,下载apk更新,这个时候会调用系统功能来安装这个apk,这就是应用外访问文件,需要传入文件的Uri. 但是这样可能会显得不太安全,万一是什么非常重要的文件就糟糕了,所以Android

  • Android SDK三种更新失败及其解决方法

    最近在网上看Moto 360的图片,真是帅,帅了又帅,比帅更帅.所以想研究下Android wear. 更新Android SDK,居然失败了三次. 1.第一次失败 出现Failed to fetch URL错误提示 Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xml, reason: Connection to https://dl-ssl.google.com refused Fa

  • android popuwindow点击外部窗口不消失的实例

    网上大多数都是说如何监听点击外部消失,但我遇到的问题是点击外面不让其消失,如下是我的解决方案,关键是:popupMenu.setBackgroundDrawable(null);popupMenu.setFocusable(false); popupMenu = new PopupWindow(view, keylinearlayout.getWidth(), LayoutParams.WRAP_CONTENT); ColorDrawable cd = new ColorDrawable(R.c

  • Android adb.exe程序启动不起来 具体解决方法

    经常遇到 Please ensure that adb is correctly located at 'D:\java\sdk\platform-tools\adb.exe' and can be executed. 遇到问题描述: 运行android程序控制台输出 [2012-07-18 16:18:26 - ] The connection to adb is down, and a severe error has occured.    [2012-07-18 16:18:26 - ]

随机推荐