Android三种实现定时器详解及实现方法

简介:

本文主要介绍 Android 定时器的知识资料,这里整理了三种方法来实现定时器的方法,有需要的小伙伴可以参考下。方法一:Handler+Thread


  
  
  1. package com.xunfang.handerDemo;  
  2.    
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.os.Message;  
  7. import android.widget.TextView;  
  8.    
  9. /**  
  10.  * handler定时器  
  11.  *  
  12.  * @author Smalt  
  13.  *  
  14.  */ 
  15. public class HanderDemoActivity extends Activity {  
  16.  TextView tvShow;  
  17.  private int i = 0;  
  18.    
  19.  @Override 
  20.  public void onCreate(Bundle savedInstanceState) {  
  21.   super.onCreate(savedInstanceState);  
  22.   setContentView(R.layout.main);  
  23.   tvShow = (TextView) findViewById(R.id.tv_show);  
  24.   new Thread(new ThreadShow()).start();  
  25.  }  
  26.    
  27.  // handler类接收数据  
  28.  Handler handler = new Handler() {  
  29.   public void handleMessage(Message msg) {  
  30.    if (msg.what == 1) {  
  31.     tvShow.setText(Integer.toString(i++));  
  32.     System.out.println("receive....");  
  33.    }  
  34.   };  
  35.  };  
  36.    
  37.  // 线程类  
  38.  class ThreadShow implements Runnable {  
  39.    
  40.   @Override 
  41.   public void run() {  
  42.    // TODO Auto-generated method stub  
  43.    while (true) {  
  44.     try {  
  45.      Thread.sleep(1000);  
  46.      Message msg = new Message();  
  47.      msg.what = 1;  
  48.      handler.sendMessage(msg);  
  49.      System.out.println("send...");  
  50.     } catch (Exception e) {  
  51.      // TODO Auto-generated catch block  
  52.      e.printStackTrace();  
  53.      System.out.println("thread error...");  
  54.     }  
  55.    }  
  56.   }  
  57.  }  
  58. }  

方法二:Handler类自带的postDelyed


  
  
  1. package com.xunfang.handerDemo;  
  2.    
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.os.Handler;  
  6. import android.widget.TextView;  
  7.    
  8. /**  
  9.  * handler定时器使用postDelyed实现  
  10.  *  
  11.  * @author Smalt  
  12.  *  
  13.  */ 
  14. public class HanderDemoActivity extends Activity {  
  15.  TextView tvShow;  
  16.  private int i = 0;  
  17.  private int TIME = 1000;  
  18.    
  19.  @Override 
  20.  public void onCreate(Bundle savedInstanceState) {  
  21.   super.onCreate(savedInstanceState);  
  22.   setContentView(R.layout.main);  
  23.   tvShow = (TextView) findViewById(R.id.tv_show);  
  24.   handler.postDelayed(runnable, TIME); //每隔1s执行  
  25.  }  
  26.    
  27.  Handler handler = new Handler();  
  28.  Runnable runnable = new Runnable() {  
  29.    
  30.   @Override 
  31.   public void run() {  
  32.    // handler自带方法实现定时器  
  33.    try {  
  34.     handler.postDelayed(this, TIME);  
  35.     tvShow.setText(Integer.toString(i++));  
  36.     System.out.println("do...");  
  37.    } catch (Exception e) {  
  38.     // TODO Auto-generated catch block  
  39.     e.printStackTrace();  
  40.     System.out.println("exception...");  
  41.    }  
  42.   }  
  43.  };  
  44.    
  45. }  

方法三:Handler+Timer+TimerTask


  
  
  1. package com.xunfang.handerDemo;  
  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.widget.TextView;  
  11.    
  12. /**  
  13.  * 定时器实现:Handler+Timer+TimerTask  
  14.  *  
  15.  * @author Smalt  
  16.  *  
  17.  */ 
  18. public class HanderDemoActivity extends Activity {  
  19.  TextView tvShow;  
  20.  private int i = 0;  
  21.  private int TIME = 1000;  
  22.    
  23.  @Override 
  24.  public void onCreate(Bundle savedInstanceState) {  
  25.   super.onCreate(savedInstanceState);  
  26.   setContentView(R.layout.main);  
  27.   tvShow = (TextView) findViewById(R.id.tv_show);  
  28.   timer.schedule(task, 1000, 1000); // 1s后执行task,经过1s再次执行  
  29.  }  
  30.    
  31.  Handler handler = new Handler() {  
  32.   public void handleMessage(Message msg) {  
  33.    if (msg.what == 1) {  
  34.     tvShow.setText(Integer.toString(i++));  
  35.    }  
  36.    super.handleMessage(msg);  
  37.   };  
  38.  };  
  39.  Timer timer = new Timer();  
  40.  TimerTask task = new TimerTask() {  
  41.    
  42.   @Override 
  43.   public void run() {  
  44.    // 需要做的事:发送消息  
  45.    Message message = new Message();  
  46.    message.what = 1;  
  47.    handler.sendMessage(message);  
  48.   }  
  49.  };  
  50. }  

以上就是对Android 定时器的资料整理后续继续补充相关知识,谢谢大家的支持!





作者:yhm2046
来源:51CTO
目录
相关文章
|
5月前
|
存储 Shell Android开发
基于Android P,自定义Android开机动画的方法
本文详细介绍了基于Android P系统自定义开机动画的步骤,包括动画文件结构、脚本编写、ZIP打包方法以及如何将自定义动画集成到AOSP源码中。
110 2
基于Android P,自定义Android开机动画的方法
|
5月前
|
Android开发
基于android-11.0.0_r39,系统应用的手动签名方法和过程
本文介绍了基于Android 11.0.0_r39版本进行系统应用手动签名的方法和解决签名过程中遇到的错误,包括处理`no conscrypt_openjdk_jni-linux-x86_64`和`RegisterNatives failed`的问题。
256 2
|
3月前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
104 15
Android 系统缓存扫描与清理方法分析
|
4月前
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
65 2
|
8月前
|
机器学习/深度学习 Java Shell
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
[RK3568][Android12.0]--- 系统自带预置第三方APK方法
800 0
|
5月前
|
Android开发
Android在rootdir根目录创建自定义目录和挂载点的方法
本文介绍了在Android高通平台的根目录下创建自定义目录和挂载点的方法,通过修改Android.mk文件并使用`LOCAL_POST_INSTALL_CMD`变量在编译过程中添加目录,最终在ramdisk.img的系统根路径下成功创建了`/factory/bin`目录。
282 1
|
5月前
|
开发工具 uml git
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
本文分享了下载AOSP源码的方法,包括如何使用repo工具和处理常见的repo sync错误,以及配置Python环境以确保顺利同步特定版本的AOSP代码。
734 0
AOSP源码下载方法,解决repo sync错误:android-13.0.0_r82
|
5月前
|
Android开发
Android项目架构设计问题之onFirstItemVisibleChanged方法的调用如何解决
Android项目架构设计问题之onFirstItemVisibleChanged方法的调用如何解决
45 0
|
5月前
|
Java 测试技术 Android开发
Android项目架构设计问题之使用反射调用类的私有方法如何解决
Android项目架构设计问题之使用反射调用类的私有方法如何解决
65 0
|
6月前
|
Android开发
Android面试题之View的invalidate方法和postInvalidate方法有什么区别
本文探讨了Android自定义View中`invalidate()`和`postInvalidate()`的区别。`invalidate()`在UI线程中刷新View,而`postInvalidate()`用于非UI线程,通过消息机制切换到UI线程执行`invalidate()`。源码分析显示,`postInvalidate()`最终调用`ViewRootImpl`的`dispatchInvalidateDelayed`,通过Handler发送消息到UI线程执行刷新。
73 1